feat(core): improve byok editing (#15427)

fix #14287
fix #15359
fix #15424

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Redesigned workspace AI provider settings with connection testing,
storage options, model selection, capability management, ordering, and
custom endpoints.
* AI chat model choices now adapt to the selected workspace and
conversation route.
  * Added support for image-based AI requests.
* **Bug Fixes**
  * Improved handling of unavailable or outdated model selections.
* App configuration updates now reject overlapping paths and load
deterministically.
* **Tests**
* Expanded coverage for provider models, AI chat scoping, image
requests, and configuration validation.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2026-08-05 19:26:19 +08:00
committed by GitHub
parent 965f4590ff
commit 543667d9b3
57 changed files with 2951 additions and 1472 deletions
@@ -1,28 +1,28 @@
{
"ar": 92,
"ca": 89,
"da": 4,
"ar": 90,
"ca": 88,
"da": 3,
"de": 98,
"el-GR": 88,
"el-GR": 86,
"en": 100,
"es-AR": 88,
"es-CL": 89,
"es": 88,
"fa": 88,
"fr": 92,
"es-AR": 87,
"es-CL": 88,
"es": 86,
"fa": 86,
"fr": 90,
"hi": 1,
"it": 89,
"ja": 88,
"kk": 96,
"ko": 89,
"nb-NO": 44,
"pl": 89,
"pt-BR": 88,
"ru": 90,
"sv-SE": 88,
"tr": 96,
"uk": 88,
"ur": 96,
"zh-Hans": 100,
"zh-Hant": 90
"it": 88,
"ja": 86,
"kk": 93,
"ko": 87,
"nb-NO": 43,
"pl": 88,
"pt-BR": 86,
"ru": 88,
"sv-SE": 87,
"tr": 93,
"uk": 86,
"ur": 93,
"zh-Hans": 97,
"zh-Hant": 88
}
+243 -46
View File
@@ -5925,10 +5925,6 @@ export function useAFFiNEI18N(): {
/**
* `AI BYOK (Beta)`
*/
["com.affine.settings.workspace.byok.title-beta"](): string;
/**
* `AI BYOK`
*/
["com.affine.settings.workspace.byok.title"](): string;
/**
* `Loading provider keys.`
@@ -5950,14 +5946,6 @@ export function useAFFiNEI18N(): {
* `Upgrade this workspace to add provider keys and route AFFiNE AI through your own OpenAI, Anthropic, Gemini, or FAL account.`
*/
["com.affine.settings.workspace.byok.locked.description"](): string;
/**
* `AI plan stays available`
*/
["com.affine.settings.workspace.byok.notice.title"](): string;
/**
* `Local keys on this device are tried first. Workspace server keys follow, then AFFiNE AI plan routes when quota is available.`
*/
["com.affine.settings.workspace.byok.notice.description"](): string;
/**
* `Provider keys`
*/
@@ -5983,13 +5971,25 @@ export function useAFFiNEI18N(): {
*/
["com.affine.settings.workspace.byok.storage.server"](): string;
/**
* `Local (this device)`
* `Available to workspace members.`
*/
["com.affine.settings.workspace.byok.storage.local-this-device"](): string;
["com.affine.settings.workspace.byok.storage.server.description"](): string;
/**
* `Local (Desktop only)`
* `Kept in this desktop devices secure storage.`
*/
["com.affine.settings.workspace.byok.storage.local-desktop-only"](): string;
["com.affine.settings.workspace.byok.storage.local.description"](): string;
/**
* `Available in the AFFiNE desktop app.`
*/
["com.affine.settings.workspace.byok.storage.local.desktop-only"](): string;
/**
* `Secure local storage is not available on this device.`
*/
["com.affine.settings.workspace.byok.storage.local.unavailable"](): string;
/**
* `Testing sends this key to the workspace server for this request only; it is not stored there.`
*/
["com.affine.settings.workspace.byok.storage.local.test-disclosure"](): string;
/**
* `Disabled after failure`
*/
@@ -5998,10 +5998,6 @@ export function useAFFiNEI18N(): {
* `Key verified`
*/
["com.affine.settings.workspace.byok.status.key-verified"](): string;
/**
* `Key test failed`
*/
["com.affine.settings.workspace.byok.status.key-test-failed"](): string;
/**
* `Text`
*/
@@ -6032,16 +6028,6 @@ export function useAFFiNEI18N(): {
["com.affine.settings.workspace.byok.row.activity.failed"](options: {
readonly date: string;
}): string;
/**
* `used {{date}}`
*/
["com.affine.settings.workspace.byok.row.activity.used"](options: {
readonly date: string;
}): string;
/**
* `used today`
*/
["com.affine.settings.workspace.byok.row.activity.used-today"](): string;
/**
* `not used yet`
*/
@@ -6113,17 +6099,69 @@ export function useAFFiNEI18N(): {
readonly count: string;
}): string;
/**
* `Add provider key`
* `Connect AI provider`
*/
["com.affine.settings.workspace.byok.modal.add-title"](): string;
["com.affine.settings.workspace.byok.modal.connect-title"](): string;
/**
* `Edit provider key`
* `Manage provider`
*/
["com.affine.settings.workspace.byok.modal.edit-title"](): string;
["com.affine.settings.workspace.byok.modal.manage-title"](): string;
/**
* `Re-enter the API key and test it before saving changes.`
* `Choose where the key is stored, then select the models AFFiNE may use.`
*/
["com.affine.settings.workspace.byok.modal.description"](): string;
["com.affine.settings.workspace.byok.modal.connect-description"](): string;
/**
* `Add models`
*/
["com.affine.settings.workspace.byok.modal.add-model-title"](): string;
/**
* `Add custom model`
*/
["com.affine.settings.workspace.byok.modal.add-custom-model-title"](): string;
/**
* `Edit model`
*/
["com.affine.settings.workspace.byok.modal.edit-model-title"](): string;
/**
* `Choose one or more models this key may use.`
*/
["com.affine.settings.workspace.byok.modal.catalog-model-description"](): string;
/**
* `Enter the endpoint model ID and choose its uses.`
*/
["com.affine.settings.workspace.byok.modal.custom-model-description"](): string;
/**
* `Connection`
*/
["com.affine.settings.workspace.byok.section.connection"](): string;
/**
* `Models`
*/
["com.affine.settings.workspace.byok.section.models"](): string;
/**
* `Advanced details`
*/
["com.affine.settings.workspace.byok.section.advanced"](): string;
/**
* `Models this key may use.`
*/
["com.affine.settings.workspace.byok.models.description.selected"](): string;
/**
* `Among compatible models, enabled models are tried from top to bottom.`
*/
["com.affine.settings.workspace.byok.models.description.order"](): string;
/**
* `No models added yet.`
*/
["com.affine.settings.workspace.byok.models.empty"](): string;
/**
* `All available models have been added.`
*/
["com.affine.settings.workspace.byok.models.all-added"](): string;
/**
* `No matching models.`
*/
["com.affine.settings.workspace.byok.models.no-search-results"](): string;
/**
* `Provider`
*/
@@ -6137,9 +6175,9 @@ export function useAFFiNEI18N(): {
*/
["com.affine.settings.workspace.byok.field.description"](): string;
/**
* `Key storage`
* `Provider enabled`
*/
["com.affine.settings.workspace.byok.field.storage"](): string;
["com.affine.settings.workspace.byok.field.provider-enabled"](): string;
/**
* `API key`
*/
@@ -6148,6 +6186,10 @@ export function useAFFiNEI18N(): {
* `Endpoint`
*/
["com.affine.settings.workspace.byok.field.endpoint"](): string;
/**
* `Model ID`
*/
["com.affine.settings.workspace.byok.field.model-id"](): string;
/**
* `Custom endpoints are disabled by the server administrator. In Self-hosted Admin, enable copilot.byok.allowCustomEndpoint.`
*/
@@ -6157,29 +6199,176 @@ export function useAFFiNEI18N(): {
*/
["com.affine.settings.workspace.byok.endpoint.private-disabled"](): string;
/**
* `Primary`
* `Leave blank to keep the current key`
*/
["com.affine.settings.workspace.byok.placeholder.key-name"](): string;
["com.affine.settings.workspace.byok.placeholder.keep-current-key"](): string;
/**
* `Workspace fallback key`
* `Model ID`
*/
["com.affine.settings.workspace.byok.placeholder.description"](): string;
["com.affine.settings.workspace.byok.placeholder.model-id"](): string;
/**
* `Search models…`
*/
["com.affine.settings.workspace.byok.placeholder.search-models"](): string;
/**
* `Use a custom API-compatible endpoint`
*/
["com.affine.settings.workspace.byok.endpoint.use-custom"](): string;
/**
* `Include an image generation request when testing (provider charges may apply)`
*/
["com.affine.settings.workspace.byok.probe.include-image"](): string;
/**
* `Connection verified`
*/
["com.affine.settings.workspace.byok.probe.verified"](): string;
/**
* `Connection failed`
*/
["com.affine.settings.workspace.byok.probe.failed"](): string;
/**
* `Recommended`
*/
["com.affine.settings.workspace.byok.model.recommended"](): string;
/**
* `This model has already been added.`
*/
["com.affine.settings.workspace.byok.model.duplicate-id"](): string;
/**
* `Not tested`
*/
["com.affine.settings.workspace.byok.model.status.not-tested"](): string;
/**
* `Verified`
*/
["com.affine.settings.workspace.byok.model.status.verified"](): string;
/**
* `Failed`
*/
["com.affine.settings.workspace.byok.model.status.failed"](): string;
/**
* `Partially verified · {{verified}} of {{total}}`
*/
["com.affine.settings.workspace.byok.model.status.partially-verified"](options: Readonly<{
verified: string;
total: string;
}>): string;
/**
* `Disabled`
*/
["com.affine.settings.workspace.byok.model.status.disabled"](): string;
/**
* `Use this model for`
*/
["com.affine.settings.workspace.byok.model.use-this-for"](): string;
/**
* `Chat & writing`
*/
["com.affine.settings.workspace.byok.model.use.chat"](): string;
/**
* `Actions`
*/
["com.affine.settings.workspace.byok.model.use.actions"](): string;
/**
* `Structured output`
*/
["com.affine.settings.workspace.byok.model.use.structured"](): string;
/**
* `Image understanding`
*/
["com.affine.settings.workspace.byok.model.use.vision"](): string;
/**
* `Image generation`
*/
["com.affine.settings.workspace.byok.model.use.image"](): string;
/**
* `Transcription`
*/
["com.affine.settings.workspace.byok.model.use.transcript"](): string;
/**
* `Workspace indexing`
*/
["com.affine.settings.workspace.byok.model.use.embedding"](): string;
/**
* `Search reranking`
*/
["com.affine.settings.workspace.byok.model.use.rerank"](): string;
/**
* `Add key`
*/
["com.affine.settings.workspace.byok.action.add-key"](): string;
/**
* `Test key`
* `Test connection`
*/
["com.affine.settings.workspace.byok.action.test-key"](): string;
["com.affine.settings.workspace.byok.action.test-connection"](): string;
/**
* `Test`
*/
["com.affine.settings.workspace.byok.action.test"](): string;
/**
* `Testing…`
*/
["com.affine.settings.workspace.byok.action.testing"](): string;
/**
* `Cancel`
*/
["com.affine.settings.workspace.byok.action.cancel"](): string;
/**
* `Save key`
* `Connect`
*/
["com.affine.settings.workspace.byok.action.save-key"](): string;
["com.affine.settings.workspace.byok.action.connect"](): string;
/**
* `Connecting…`
*/
["com.affine.settings.workspace.byok.action.connecting"](): string;
/**
* `Save changes`
*/
["com.affine.settings.workspace.byok.action.save-changes"](): string;
/**
* `Add model`
*/
["com.affine.settings.workspace.byok.action.add-model"](): string;
/**
* `Add {{count}} models`
*/
["com.affine.settings.workspace.byok.action.add-selected-models"](options: {
readonly count: string;
}): string;
/**
* `Save model`
*/
["com.affine.settings.workspace.byok.action.save-model"](): string;
/**
* `Enable {{model}}`
*/
["com.affine.settings.workspace.byok.action.enable-model"](options: {
readonly model: string;
}): string;
/**
* `Disable {{model}}`
*/
["com.affine.settings.workspace.byok.action.disable-model"](options: {
readonly model: string;
}): string;
/**
* `Options for {{model}}`
*/
["com.affine.settings.workspace.byok.action.model-options"](options: {
readonly model: string;
}): string;
/**
* `Move up`
*/
["com.affine.settings.workspace.byok.action.move-up"](): string;
/**
* `Move down`
*/
["com.affine.settings.workspace.byok.action.move-down"](): string;
/**
* `Remove`
*/
["com.affine.settings.workspace.byok.action.remove"](): string;
/**
* `Clear all BYOK keys`
*/
@@ -6228,6 +6417,14 @@ export function useAFFiNEI18N(): {
* `BYOK keys not cleared`
*/
["com.affine.settings.workspace.byok.notify.clear-failed.title"](): string;
/**
* `BYOK settings changed`
*/
["com.affine.settings.workspace.byok.notify.reload-required.title"](): string;
/**
* `Reload the settings and try again.`
*/
["com.affine.settings.workspace.byok.notify.reload-required.message"](): string;
/**
* `Please try again.`
*/
@@ -1480,25 +1480,19 @@
"com.affine.settings.workspace": "Workspace",
"com.affine.settings.workspace.description": "Hier kannst du die Informationen zum aktuellen Workspace anzeigen.",
"com.affine.settings.workspace.byok.title-beta": "AI BYOK (Beta)",
"com.affine.settings.workspace.byok.title": "AI BYOK",
"com.affine.settings.workspace.byok.loading": "Provider-Schlüssel werden geladen.",
"com.affine.settings.workspace.byok.subtitle": "Benutze deine eigenen Provider-Schlüssel für diesen Workspace.",
"com.affine.settings.workspace.byok.header": "Benutze die Workspace-Provider-Schlüssel vor der Verwendung des AFFiNE AI Plans.",
"com.affine.settings.workspace.byok.locked.title": "Für BYOK ist die Pro-, Team- oder Believer-Version erforderlich",
"com.affine.settings.workspace.byok.locked.description": "Upgrade diesen Workspace, um Provider-Schlüssel hinzuzufügen und AFFiNE AI über dein eigenes OpenAI-, Anthropic-, Gemini- oder FAL-Konto zu routen.",
"com.affine.settings.workspace.byok.notice.title": "Der AI-Plan bleibt verfügbar",
"com.affine.settings.workspace.byok.notice.description": "Zunächst werden lokale Schlüssel auf diesem Gerät geprüft. Anschließend folgen die Schlüssel des Workspace-Servers und schließlich die Routen des AFFiNE AI-Plans, sofern Kontingent verfügbar ist.",
"com.affine.settings.workspace.byok.keys.title": "Provider-Schlüssel",
"com.affine.settings.workspace.byok.keys.description": "Die Reihenfolge in der Liste bestimmt die Fallback-Reihenfolge innerhalb jeder Speichergruppe.",
"com.affine.settings.workspace.byok.empty.title": "Keine Provider-Schlüssel",
"com.affine.settings.workspace.byok.empty.description": "Füge einen Schlüssel hinzu, um die erste Route für diesen Workspace zu erstellen. Die Zeilen des Providers werden erst angezeigt, wenn ein Schlüssel vorhanden ist.",
"com.affine.settings.workspace.byok.storage.local": "Lokal",
"com.affine.settings.workspace.byok.storage.server": "Server",
"com.affine.settings.workspace.byok.storage.local-this-device": "Lokal (dieses Gerät)",
"com.affine.settings.workspace.byok.storage.local-desktop-only": "Lokal (nur Desktop)",
"com.affine.settings.workspace.byok.status.disabled-after-failure": "Nach Fehler deaktiviert",
"com.affine.settings.workspace.byok.status.key-verified": "Schlüssel verifiziert",
"com.affine.settings.workspace.byok.status.key-test-failed": "Schlüssel-Test fehlgeschlagen",
"com.affine.settings.workspace.byok.capability.text": "Text",
"com.affine.settings.workspace.byok.capability.image-input": "Bildeingabe",
"com.affine.settings.workspace.byok.capability.actions": "Aktionen",
@@ -1506,8 +1500,6 @@
"com.affine.settings.workspace.byok.capability.transcript": "Transkript",
"com.affine.settings.workspace.byok.capability.indexing": "Indizierung",
"com.affine.settings.workspace.byok.row.activity.failed": "fehlgeschlagen {{date}}",
"com.affine.settings.workspace.byok.row.activity.used": "verwendet {{date}}",
"com.affine.settings.workspace.byok.row.activity.used-today": "heute verwendet",
"com.affine.settings.workspace.byok.row.activity.unused": "noch nicht verwendet",
"com.affine.settings.workspace.byok.coverage.title": "Feature-Abdeckung",
"com.affine.settings.workspace.byok.feature.chat.title": "Schreiben und Chatten",
@@ -1525,23 +1517,15 @@
"com.affine.settings.workspace.byok.usage.title": "BYOK-Nutzung",
"com.affine.settings.workspace.byok.usage.period": "Letzte 30 Tage",
"com.affine.settings.workspace.byok.usage.tokens": "{{count}} Token",
"com.affine.settings.workspace.byok.modal.add-title": "Provider-Schlüssel hinzufügen",
"com.affine.settings.workspace.byok.modal.edit-title": "Provider-Schlüssel bearbeiten",
"com.affine.settings.workspace.byok.modal.description": "Den API-Key erneut eingeben und vor dem Speichern der Änderungen testen.",
"com.affine.settings.workspace.byok.field.provider": "Provider",
"com.affine.settings.workspace.byok.field.key-name": "Schlüsselname",
"com.affine.settings.workspace.byok.field.description": "Beschreibung",
"com.affine.settings.workspace.byok.field.storage": "Schlüssel-Speicher",
"com.affine.settings.workspace.byok.field.api-key": "API-Key",
"com.affine.settings.workspace.byok.field.endpoint": "Endpunkt",
"com.affine.settings.workspace.byok.endpoint.custom-disabled": "Benutzerdefinierte Endpunkte wurden vom Serveradministrator deaktiviert. Aktiviere in Self-hosted Admin die Einstellung copilot.byok.allowCustomEndpoint.",
"com.affine.settings.workspace.byok.endpoint.private-disabled": "Für Endpunkte in privaten Netzwerken muss der Serveradministrator zusätzlich die Einstellung copilot.byok.allowPrivateEndpoint aktivieren.",
"com.affine.settings.workspace.byok.placeholder.key-name": "Primär",
"com.affine.settings.workspace.byok.placeholder.description": "Workspace-Fallback-Schlüssel",
"com.affine.settings.workspace.byok.action.add-key": "Schlüssel hinzufügen",
"com.affine.settings.workspace.byok.action.test-key": "Schlüssel testen",
"com.affine.settings.workspace.byok.action.cancel": "Abbrechen",
"com.affine.settings.workspace.byok.action.save-key": "Schlüssel speichern",
"com.affine.settings.workspace.byok.action.clear-all": "Alle BYOK-Schlüssel löschen",
"com.affine.settings.workspace.byok.action.reorder": "Umsortieren",
"com.affine.settings.workspace.byok.action.edit": "Bearbeiten",
+64 -17
View File
@@ -1479,26 +1479,25 @@
"com.affine.settings.meetings.record.permission-modal.open-setting": "Open System Settings",
"com.affine.settings.workspace": "Workspace",
"com.affine.settings.workspace.description": "You can view current workspace's information here.",
"com.affine.settings.workspace.byok.title-beta": "AI BYOK (Beta)",
"com.affine.settings.workspace.byok.title": "AI BYOK",
"com.affine.settings.workspace.byok.title": "AI BYOK (Beta)",
"com.affine.settings.workspace.byok.loading": "Loading provider keys.",
"com.affine.settings.workspace.byok.subtitle": "Use your own provider keys for this workspace.",
"com.affine.settings.workspace.byok.header": "Use workspace provider keys before AFFiNE AI plan routes.",
"com.affine.settings.workspace.byok.locked.title": "BYOK requires Pro, Team, or Believer",
"com.affine.settings.workspace.byok.locked.description": "Upgrade this workspace to add provider keys and route AFFiNE AI through your own OpenAI, Anthropic, Gemini, or FAL account.",
"com.affine.settings.workspace.byok.notice.title": "AI plan stays available",
"com.affine.settings.workspace.byok.notice.description": "Local keys on this device are tried first. Workspace server keys follow, then AFFiNE AI plan routes when quota is available.",
"com.affine.settings.workspace.byok.keys.title": "Provider keys",
"com.affine.settings.workspace.byok.keys.description": "List order controls fallback within each storage group.",
"com.affine.settings.workspace.byok.empty.title": "No provider keys",
"com.affine.settings.workspace.byok.empty.description": "Add a key to create the first route for this workspace. Provider rows are not shown until a key exists.",
"com.affine.settings.workspace.byok.storage.local": "Local",
"com.affine.settings.workspace.byok.storage.server": "Server",
"com.affine.settings.workspace.byok.storage.local-this-device": "Local (this device)",
"com.affine.settings.workspace.byok.storage.local-desktop-only": "Local (Desktop only)",
"com.affine.settings.workspace.byok.storage.server.description": "Available to workspace members.",
"com.affine.settings.workspace.byok.storage.local.description": "Kept in this desktop devices secure storage.",
"com.affine.settings.workspace.byok.storage.local.desktop-only": "Available in the AFFiNE desktop app.",
"com.affine.settings.workspace.byok.storage.local.unavailable": "Secure local storage is not available on this device.",
"com.affine.settings.workspace.byok.storage.local.test-disclosure": "Testing sends this key to the workspace server for this request only; it is not stored there.",
"com.affine.settings.workspace.byok.status.disabled-after-failure": "Disabled after failure",
"com.affine.settings.workspace.byok.status.key-verified": "Key verified",
"com.affine.settings.workspace.byok.status.key-test-failed": "Key test failed",
"com.affine.settings.workspace.byok.capability.text": "Text",
"com.affine.settings.workspace.byok.capability.image-input": "Image input",
"com.affine.settings.workspace.byok.capability.actions": "Actions",
@@ -1506,8 +1505,6 @@
"com.affine.settings.workspace.byok.capability.transcript": "Transcript",
"com.affine.settings.workspace.byok.capability.indexing": "Indexing",
"com.affine.settings.workspace.byok.row.activity.failed": "failed {{date}}",
"com.affine.settings.workspace.byok.row.activity.used": "used {{date}}",
"com.affine.settings.workspace.byok.row.activity.used-today": "used today",
"com.affine.settings.workspace.byok.row.activity.unused": "not used yet",
"com.affine.settings.workspace.byok.coverage.title": "Feature coverage",
"com.affine.settings.workspace.byok.feature.chat.title": "Writing and chat",
@@ -1525,23 +1522,71 @@
"com.affine.settings.workspace.byok.usage.title": "BYOK usage",
"com.affine.settings.workspace.byok.usage.period": "Last 30 days",
"com.affine.settings.workspace.byok.usage.tokens": "{{count}} tokens",
"com.affine.settings.workspace.byok.modal.add-title": "Add provider key",
"com.affine.settings.workspace.byok.modal.edit-title": "Edit provider key",
"com.affine.settings.workspace.byok.modal.description": "Re-enter the API key and test it before saving changes.",
"com.affine.settings.workspace.byok.modal.connect-title": "Connect AI provider",
"com.affine.settings.workspace.byok.modal.manage-title": "Manage provider",
"com.affine.settings.workspace.byok.modal.connect-description": "Choose where the key is stored, then select the models AFFiNE may use.",
"com.affine.settings.workspace.byok.modal.add-model-title": "Add models",
"com.affine.settings.workspace.byok.modal.add-custom-model-title": "Add custom model",
"com.affine.settings.workspace.byok.modal.edit-model-title": "Edit model",
"com.affine.settings.workspace.byok.modal.catalog-model-description": "Choose one or more models this key may use.",
"com.affine.settings.workspace.byok.modal.custom-model-description": "Enter the endpoint model ID and choose its uses.",
"com.affine.settings.workspace.byok.section.connection": "Connection",
"com.affine.settings.workspace.byok.section.models": "Models",
"com.affine.settings.workspace.byok.section.advanced": "Advanced details",
"com.affine.settings.workspace.byok.models.description.selected": "Models this key may use.",
"com.affine.settings.workspace.byok.models.description.order": "Among compatible models, enabled models are tried from top to bottom.",
"com.affine.settings.workspace.byok.models.empty": "No models added yet.",
"com.affine.settings.workspace.byok.models.all-added": "All available models have been added.",
"com.affine.settings.workspace.byok.models.no-search-results": "No matching models.",
"com.affine.settings.workspace.byok.field.provider": "Provider",
"com.affine.settings.workspace.byok.field.key-name": "Key name",
"com.affine.settings.workspace.byok.field.description": "Description",
"com.affine.settings.workspace.byok.field.storage": "Key storage",
"com.affine.settings.workspace.byok.field.provider-enabled": "Provider enabled",
"com.affine.settings.workspace.byok.field.api-key": "API key",
"com.affine.settings.workspace.byok.field.endpoint": "Endpoint",
"com.affine.settings.workspace.byok.field.model-id": "Model ID",
"com.affine.settings.workspace.byok.endpoint.custom-disabled": "Custom endpoints are disabled by the server administrator. In Self-hosted Admin, enable copilot.byok.allowCustomEndpoint.",
"com.affine.settings.workspace.byok.endpoint.private-disabled": "Private network endpoints additionally require the server administrator to enable copilot.byok.allowPrivateEndpoint.",
"com.affine.settings.workspace.byok.placeholder.key-name": "Primary",
"com.affine.settings.workspace.byok.placeholder.description": "Workspace fallback key",
"com.affine.settings.workspace.byok.placeholder.keep-current-key": "Leave blank to keep the current key",
"com.affine.settings.workspace.byok.placeholder.model-id": "Model ID",
"com.affine.settings.workspace.byok.placeholder.search-models": "Search models…",
"com.affine.settings.workspace.byok.endpoint.use-custom": "Use a custom API-compatible endpoint",
"com.affine.settings.workspace.byok.probe.include-image": "Include an image generation request when testing (provider charges may apply)",
"com.affine.settings.workspace.byok.probe.verified": "Connection verified",
"com.affine.settings.workspace.byok.probe.failed": "Connection failed",
"com.affine.settings.workspace.byok.model.recommended": "Recommended",
"com.affine.settings.workspace.byok.model.duplicate-id": "This model has already been added.",
"com.affine.settings.workspace.byok.model.status.not-tested": "Not tested",
"com.affine.settings.workspace.byok.model.status.verified": "Verified",
"com.affine.settings.workspace.byok.model.status.failed": "Failed",
"com.affine.settings.workspace.byok.model.status.partially-verified": "Partially verified · {{verified}} of {{total}}",
"com.affine.settings.workspace.byok.model.status.disabled": "Disabled",
"com.affine.settings.workspace.byok.model.use-this-for": "Use this model for",
"com.affine.settings.workspace.byok.model.use.chat": "Chat & writing",
"com.affine.settings.workspace.byok.model.use.actions": "Actions",
"com.affine.settings.workspace.byok.model.use.structured": "Structured output",
"com.affine.settings.workspace.byok.model.use.vision": "Image understanding",
"com.affine.settings.workspace.byok.model.use.image": "Image generation",
"com.affine.settings.workspace.byok.model.use.transcript": "Transcription",
"com.affine.settings.workspace.byok.model.use.embedding": "Workspace indexing",
"com.affine.settings.workspace.byok.model.use.rerank": "Search reranking",
"com.affine.settings.workspace.byok.action.add-key": "Add key",
"com.affine.settings.workspace.byok.action.test-key": "Test key",
"com.affine.settings.workspace.byok.action.test-connection": "Test connection",
"com.affine.settings.workspace.byok.action.test": "Test",
"com.affine.settings.workspace.byok.action.testing": "Testing…",
"com.affine.settings.workspace.byok.action.cancel": "Cancel",
"com.affine.settings.workspace.byok.action.save-key": "Save key",
"com.affine.settings.workspace.byok.action.connect": "Connect",
"com.affine.settings.workspace.byok.action.connecting": "Connecting…",
"com.affine.settings.workspace.byok.action.save-changes": "Save changes",
"com.affine.settings.workspace.byok.action.add-model": "Add model",
"com.affine.settings.workspace.byok.action.add-selected-models": "Add {{count}} models",
"com.affine.settings.workspace.byok.action.save-model": "Save model",
"com.affine.settings.workspace.byok.action.enable-model": "Enable {{model}}",
"com.affine.settings.workspace.byok.action.disable-model": "Disable {{model}}",
"com.affine.settings.workspace.byok.action.model-options": "Options for {{model}}",
"com.affine.settings.workspace.byok.action.move-up": "Move up",
"com.affine.settings.workspace.byok.action.move-down": "Move down",
"com.affine.settings.workspace.byok.action.remove": "Remove",
"com.affine.settings.workspace.byok.action.clear-all": "Clear all BYOK keys",
"com.affine.settings.workspace.byok.action.reorder": "Reorder",
"com.affine.settings.workspace.byok.action.edit": "Edit",
@@ -1554,6 +1599,8 @@
"com.affine.settings.workspace.byok.notify.delete-failed.title": "BYOK key not deleted",
"com.affine.settings.workspace.byok.notify.reorder-failed.title": "BYOK keys not reordered",
"com.affine.settings.workspace.byok.notify.clear-failed.title": "BYOK keys not cleared",
"com.affine.settings.workspace.byok.notify.reload-required.title": "BYOK settings changed",
"com.affine.settings.workspace.byok.notify.reload-required.message": "Reload the settings and try again.",
"com.affine.settings.workspace.byok.notify.operation-failed.message": "Please try again.",
"com.affine.settings.workspace.byok.notify.cross-storage-reorder.title": "Cannot reorder across storage",
"com.affine.settings.workspace.byok.notify.cross-storage-reorder.message": "Local keys and server keys keep separate fallback order.",
@@ -1439,25 +1439,19 @@
"com.affine.settings.workspace": "Жұмыс кеңістігі",
"com.affine.settings.workspace.description": "Ағымдағы жұмыс кеңістігінің ақпаратын осы жерден көре аласың.",
"com.affine.settings.workspace.byok.title-beta": "AI BYOK (Бета)",
"com.affine.settings.workspace.byok.title": "AI BYOK",
"com.affine.settings.workspace.byok.loading": "Провайдер кілттері жүктелуде.",
"com.affine.settings.workspace.byok.subtitle": "Бұл жұмыс кеңістігі үшін өз провайдер кілттеріңді пайдалан.",
"com.affine.settings.workspace.byok.header": "AFFiNE AI жоспар бағыттарына дейін жұмыс кеңістігінің провайдер кілттерін пайдалан.",
"com.affine.settings.workspace.byok.locked.title": "BYOK үшін Pro, Team немесе Believer қажет",
"com.affine.settings.workspace.byok.locked.description": "Провайдер кілттерін қосу және AFFiNE AI-ды өзіңнің OpenAI, Anthropic, Gemini немесе FAL аккаунтың арқылы бағыттау үшін осы жұмыс кеңістігін жаңарт.",
"com.affine.settings.workspace.byok.notice.title": "AI жоспары қолжетімді болып қалады",
"com.affine.settings.workspace.byok.notice.description": "Алдымен осы құрылғыдағы жергілікті кілттер сыналады. Одан кейін жұмыс кеңістігінің сервер кілттері, сосын квота болған кезде AFFiNE AI жоспар бағыттары пайдаланылады.",
"com.affine.settings.workspace.byok.keys.title": "Провайдер кілттері",
"com.affine.settings.workspace.byok.keys.description": "Тізім реті әр сақтау тобы ішінде резервтік ретті басқарады.",
"com.affine.settings.workspace.byok.empty.title": "Провайдер кілттері жоқ",
"com.affine.settings.workspace.byok.empty.description": "Осы жұмыс кеңістігі үшін бірінші бағытты жасау үшін кілт қос. Кілт болмайынша провайдер жолдары көрсетілмейді.",
"com.affine.settings.workspace.byok.storage.local": "Жергілікті",
"com.affine.settings.workspace.byok.storage.server": "Сервер",
"com.affine.settings.workspace.byok.storage.local-this-device": "Жергілікті (осы құрылғыда)",
"com.affine.settings.workspace.byok.storage.local-desktop-only": "Жергілікті (тек десктопта)",
"com.affine.settings.workspace.byok.status.disabled-after-failure": "Сәтсіздіктен кейін өшірілді",
"com.affine.settings.workspace.byok.status.key-verified": "Кілт расталды",
"com.affine.settings.workspace.byok.status.key-test-failed": "Кілтті тексеру сәтсіз аяқталды",
"com.affine.settings.workspace.byok.capability.text": "Мәтін",
"com.affine.settings.workspace.byok.capability.image-input": "Сурет енгізу",
"com.affine.settings.workspace.byok.capability.actions": "Әрекеттер",
@@ -1465,8 +1459,6 @@
"com.affine.settings.workspace.byok.capability.transcript": "Транскрипт",
"com.affine.settings.workspace.byok.capability.indexing": "Индекстеу",
"com.affine.settings.workspace.byok.row.activity.failed": "{{date}} күні сәтсіз аяқталды",
"com.affine.settings.workspace.byok.row.activity.used": "{{date}} күні қолданылды",
"com.affine.settings.workspace.byok.row.activity.used-today": "бүгін қолданылды",
"com.affine.settings.workspace.byok.row.activity.unused": "әлі қолданылмаған",
"com.affine.settings.workspace.byok.coverage.title": "Функцияларды қамту",
"com.affine.settings.workspace.byok.feature.chat.title": "Жазу және чат",
@@ -1484,21 +1476,13 @@
"com.affine.settings.workspace.byok.usage.title": "BYOK қолданылуы",
"com.affine.settings.workspace.byok.usage.period": "Соңғы 30 күн",
"com.affine.settings.workspace.byok.usage.tokens": "{{count}} токен",
"com.affine.settings.workspace.byok.modal.add-title": "Провайдер кілтін қос",
"com.affine.settings.workspace.byok.modal.edit-title": "Провайдер кілтін өңде",
"com.affine.settings.workspace.byok.modal.description": "API кілтін қайта енгіз және өзгерістерді сақтамас бұрын оны тексер.",
"com.affine.settings.workspace.byok.field.provider": "Провайдер",
"com.affine.settings.workspace.byok.field.key-name": "Кілт атауы",
"com.affine.settings.workspace.byok.field.description": "Сипаттама",
"com.affine.settings.workspace.byok.field.storage": "Кілт сақтау орны",
"com.affine.settings.workspace.byok.field.api-key": "API кілті",
"com.affine.settings.workspace.byok.field.endpoint": "Эндпойнт",
"com.affine.settings.workspace.byok.placeholder.key-name": "Негізгі",
"com.affine.settings.workspace.byok.placeholder.description": "Жұмыс кеңістігінің резервтік кілті",
"com.affine.settings.workspace.byok.action.add-key": "Кілтті қос",
"com.affine.settings.workspace.byok.action.test-key": "Кілтті тексер",
"com.affine.settings.workspace.byok.action.cancel": "Бас тарт",
"com.affine.settings.workspace.byok.action.save-key": "Кілтті сақта",
"com.affine.settings.workspace.byok.action.clear-all": "Барлық BYOK кілттерін тазарт",
"com.affine.settings.workspace.byok.action.reorder": "Ретін өзгерт",
"com.affine.settings.workspace.byok.action.edit": "Өңде",
@@ -1439,25 +1439,19 @@
"com.affine.settings.workspace": "Çalışma alanı",
"com.affine.settings.workspace.description": "Mevcut çalışma alanının bilgilerini burada görüntüleyebilirsiniz.",
"com.affine.settings.workspace.byok.title-beta": "AI BYOK (Beta)",
"com.affine.settings.workspace.byok.title": "AI BYOK",
"com.affine.settings.workspace.byok.loading": "Sağlayıcı anahtarları yükleniyor.",
"com.affine.settings.workspace.byok.subtitle": "Bu çalışma alanı için kendi sağlayıcı anahtarlarınızı kullanın.",
"com.affine.settings.workspace.byok.header": "AFFiNE AI plan rotalarından önce çalışma alanı sağlayıcı anahtarlarını kullanın.",
"com.affine.settings.workspace.byok.locked.title": "BYOK için Pro, Team veya Believer gerekir",
"com.affine.settings.workspace.byok.locked.description": "Sağlayıcı anahtarları eklemek ve AFFiNE AI'yi kendi OpenAI, Anthropic, Gemini veya FAL hesabınız üzerinden yönlendirmek için bu çalışma alanını yükseltin.",
"com.affine.settings.workspace.byok.notice.title": "Yapay zeka planı kullanılabilir durumda kalacak",
"com.affine.settings.workspace.byok.notice.description": "Önce bu cihazdaki yerel anahtarlar denenir. Çalışma alanı sunucusu anahtarları takip eder ve ardından kota mevcut olduğunda AFFiNE AI rotaları planlar.",
"com.affine.settings.workspace.byok.keys.title": "Sağlayıcı anahtarları",
"com.affine.settings.workspace.byok.keys.description": "Her depolama grubunda yedek (fallback) sırasını liste sırası belirler.",
"com.affine.settings.workspace.byok.empty.title": "Sağlayıcı anahtarı yok",
"com.affine.settings.workspace.byok.empty.description": "Bu çalışma alanı için ilk rotayı oluşturmak üzere bir anahtar ekleyin. Sağlayıcı satırları bir anahtar mevcut olana kadar gösterilmez.",
"com.affine.settings.workspace.byok.storage.local": "Yerel",
"com.affine.settings.workspace.byok.storage.server": "Sunucu",
"com.affine.settings.workspace.byok.storage.local-this-device": "Yerel (bu cihaz)",
"com.affine.settings.workspace.byok.storage.local-desktop-only": "Yerel (Yalnızca masaüstü)",
"com.affine.settings.workspace.byok.status.disabled-after-failure": "Arızadan sonra devre dışı bırakıldı",
"com.affine.settings.workspace.byok.status.key-verified": "Anahtar doğrulandı",
"com.affine.settings.workspace.byok.status.key-test-failed": "Anahtar testi başarısız oldu",
"com.affine.settings.workspace.byok.capability.text": "Metin",
"com.affine.settings.workspace.byok.capability.image-input": "Görüntü girişi",
"com.affine.settings.workspace.byok.capability.actions": "Eylemler",
@@ -1465,8 +1459,6 @@
"com.affine.settings.workspace.byok.capability.transcript": "Deşifre metni",
"com.affine.settings.workspace.byok.capability.indexing": "İndeksleme",
"com.affine.settings.workspace.byok.row.activity.failed": "başarısız oldu {{date}}",
"com.affine.settings.workspace.byok.row.activity.used": "{{date}} kullanıldı",
"com.affine.settings.workspace.byok.row.activity.used-today": "Bugün kullanıldı",
"com.affine.settings.workspace.byok.row.activity.unused": "henüz kullanılmadı",
"com.affine.settings.workspace.byok.coverage.title": "Özellik kapsamı",
"com.affine.settings.workspace.byok.feature.chat.title": "Yazma ve sohbet",
@@ -1484,21 +1476,13 @@
"com.affine.settings.workspace.byok.usage.title": "BYOK kullanımı",
"com.affine.settings.workspace.byok.usage.period": "Son 30 gün",
"com.affine.settings.workspace.byok.usage.tokens": "{{count}} jeton",
"com.affine.settings.workspace.byok.modal.add-title": "Sağlayıcı anahtarı ekle",
"com.affine.settings.workspace.byok.modal.edit-title": "Sağlayıcı anahtarını düzenle",
"com.affine.settings.workspace.byok.modal.description": "Değişiklikleri kaydetmeden önce API anahtarını tekrar girin ve test edin.",
"com.affine.settings.workspace.byok.field.provider": "Sağlayıcı",
"com.affine.settings.workspace.byok.field.key-name": "Anahtar adı",
"com.affine.settings.workspace.byok.field.description": "Tanım",
"com.affine.settings.workspace.byok.field.storage": "Anahtar saklama",
"com.affine.settings.workspace.byok.field.api-key": "API anahtarı",
"com.affine.settings.workspace.byok.field.endpoint": "Uç nokta",
"com.affine.settings.workspace.byok.placeholder.key-name": "Birincil",
"com.affine.settings.workspace.byok.placeholder.description": "Çalışma alanı yedek anahtarı",
"com.affine.settings.workspace.byok.action.add-key": "Anahtar ekle",
"com.affine.settings.workspace.byok.action.test-key": "Test anahtarı",
"com.affine.settings.workspace.byok.action.cancel": "İptal",
"com.affine.settings.workspace.byok.action.save-key": "Anahtarı kaydet",
"com.affine.settings.workspace.byok.action.clear-all": "Tüm BYOK anahtarlarını temizle",
"com.affine.settings.workspace.byok.action.reorder": "Yeniden sırala",
"com.affine.settings.workspace.byok.action.edit": "Düzenle",
@@ -1735,8 +1735,6 @@
"com.affine.settings.workspace.byok.action.delete": "حذف کریں۔",
"com.affine.settings.workspace.byok.action.edit": "ترمیم کریں۔",
"com.affine.settings.workspace.byok.action.reorder": "دوبارہ ترتیب دیں۔",
"com.affine.settings.workspace.byok.action.save-key": "کلید محفوظ کریں۔",
"com.affine.settings.workspace.byok.action.test-key": "ٹیسٹ کلید",
"com.affine.settings.workspace.byok.capability.actions": "اعمال",
"com.affine.settings.workspace.byok.capability.image-generate": "تصویر بنائیں",
"com.affine.settings.workspace.byok.capability.image-input": "امیج ان پٹ",
@@ -1761,18 +1759,12 @@
"com.affine.settings.workspace.byok.field.endpoint": "اختتامی نقطہ",
"com.affine.settings.workspace.byok.field.key-name": "کلیدی نام",
"com.affine.settings.workspace.byok.field.provider": "فراہم کرنے والا",
"com.affine.settings.workspace.byok.field.storage": "کلیدی ذخیرہ",
"com.affine.settings.workspace.byok.header": "AFFiNE AI پلان کے راستوں سے پہلے ورک اسپیس فراہم کنندہ کیز استعمال کریں۔",
"com.affine.settings.workspace.byok.keys.description": "فہرست آرڈر کنٹرولز فال بیک ہر اسٹوریج گروپ کے اندر۔",
"com.affine.settings.workspace.byok.keys.title": "فراہم کنندہ کی چابیاں",
"com.affine.settings.workspace.byok.loading": "فراہم کنندہ کی چابیاں لوڈ ہو رہی ہیں۔",
"com.affine.settings.workspace.byok.locked.description": "فراہم کنندہ کیز شامل کرنے کے لیے اس ورک اسپیس کو اپ گریڈ کریں اور AFFiNE AI کو اپنے OpenAI، Anthropic، Gemini، یا FAL اکاؤنٹ کے ذریعے روٹ کریں۔",
"com.affine.settings.workspace.byok.locked.title": "BYOK کو پرو، ٹیم، یا مومن درکار ہے۔",
"com.affine.settings.workspace.byok.modal.add-title": "فراہم کنندہ کلید شامل کریں۔",
"com.affine.settings.workspace.byok.modal.description": "API کلید دوبارہ درج کریں اور تبدیلیاں محفوظ کرنے سے پہلے اس کی جانچ کریں۔",
"com.affine.settings.workspace.byok.modal.edit-title": "فراہم کنندہ کلید میں ترمیم کریں۔",
"com.affine.settings.workspace.byok.notice.description": "اس آلہ پر مقامی کلیدیں پہلے آزمائی جاتی ہیں۔ ورک اسپیس سرور کیز فالو کرتی ہیں، پھر کوٹہ دستیاب ہونے پر AFFiNE AI پلان روٹس۔",
"com.affine.settings.workspace.byok.notice.title": "AI پلان دستیاب رہتا ہے۔",
"com.affine.settings.workspace.byok.notify.clear-failed.title": "BYOK کیز صاف نہیں ہوئیں",
"com.affine.settings.workspace.byok.notify.cross-storage-reorder.message": "لوکل کیز اور سرور کیز الگ الگ فال بیک آرڈر رکھتی ہیں۔",
"com.affine.settings.workspace.byok.notify.cross-storage-reorder.title": "پورے اسٹوریج میں دوبارہ ترتیب نہیں دی جا سکتی",
@@ -1784,21 +1776,13 @@
"com.affine.settings.workspace.byok.notify.reorder-failed.title": "BYOK کیز دوبارہ ترتیب نہیں دی گئیں۔",
"com.affine.settings.workspace.byok.notify.save-failed.title": "BYOK کلید محفوظ نہیں ہے۔",
"com.affine.settings.workspace.byok.notify.test-failed.title": "کلیدی ٹیسٹ ناکام ہو گیا۔",
"com.affine.settings.workspace.byok.placeholder.description": "ورک اسپیس فال بیک کلید",
"com.affine.settings.workspace.byok.placeholder.key-name": "پرائمری",
"com.affine.settings.workspace.byok.row.activity.failed": "ناکام {{date}}",
"com.affine.settings.workspace.byok.row.activity.unused": "ابھی تک استعمال نہیں کیا",
"com.affine.settings.workspace.byok.row.activity.used": "استعمال شدہ {{date}}",
"com.affine.settings.workspace.byok.row.activity.used-today": "آج استعمال کیا جاتا ہے",
"com.affine.settings.workspace.byok.status.disabled-after-failure": "ناکامی کے بعد معذور",
"com.affine.settings.workspace.byok.status.key-test-failed": "کلیدی ٹیسٹ ناکام ہو گیا۔",
"com.affine.settings.workspace.byok.status.key-verified": "کلید کی تصدیق ہو گئی۔",
"com.affine.settings.workspace.byok.storage.local": "مقامی",
"com.affine.settings.workspace.byok.storage.local-desktop-only": "مقامی (صرف ڈیسک ٹاپ)",
"com.affine.settings.workspace.byok.storage.local-this-device": "مقامی (یہ آلہ)",
"com.affine.settings.workspace.byok.storage.server": "سرور",
"com.affine.settings.workspace.byok.subtitle": "اس ورک اسپیس کے لیے اپنی فراہم کنندہ کیز استعمال کریں۔",
"com.affine.settings.workspace.byok.title": "AI BYOK",
"com.affine.settings.workspace.byok.title-beta": "AI BYOK (بیٹا)",
"com.affine.settings.workspace.byok.usage.period": "آخری 30 دن",
"com.affine.settings.workspace.byok.usage.title": "BYOK کا استعمال",
@@ -1478,25 +1478,19 @@
"com.affine.settings.workspace": "工作区",
"com.affine.settings.workspace.description": "您可以在此处自定义您的工作区。",
"com.affine.settings.workspace.byok.title-beta": "AI BYOKBeta",
"com.affine.settings.workspace.byok.title": "AI BYOK",
"com.affine.settings.workspace.byok.loading": "正在加载服务商密钥。",
"com.affine.settings.workspace.byok.subtitle": "为此工作区使用您自己的服务商密钥。",
"com.affine.settings.workspace.byok.header": "优先使用工作区服务商密钥,再回退到 AFFiNE AI 套餐通道。",
"com.affine.settings.workspace.byok.locked.title": "BYOK 需要 Pro、Team 或 Believer",
"com.affine.settings.workspace.byok.locked.description": "升级此工作区后,可添加服务商密钥,并通过您自己的 OpenAI、Anthropic、Gemini 或 FAL 账号路由 AFFiNE AI。",
"com.affine.settings.workspace.byok.notice.title": "AI 套餐仍可用",
"com.affine.settings.workspace.byok.notice.description": "会先尝试此设备上的本地密钥,然后使用工作区服务端密钥,最后在额度可用时回退到 AFFiNE AI 套餐通道。",
"com.affine.settings.workspace.byok.keys.title": "服务商密钥",
"com.affine.settings.workspace.byok.keys.description": "列表顺序控制每个存储分组内的回退顺序。",
"com.affine.settings.workspace.byok.empty.title": "暂无服务商密钥",
"com.affine.settings.workspace.byok.empty.description": "添加密钥后,将为此工作区创建第一条路由。创建前不会显示服务商行。",
"com.affine.settings.workspace.byok.storage.local": "本地",
"com.affine.settings.workspace.byok.storage.server": "服务端",
"com.affine.settings.workspace.byok.storage.local-this-device": "本地(此设备)",
"com.affine.settings.workspace.byok.storage.local-desktop-only": "本地(仅桌面端)",
"com.affine.settings.workspace.byok.status.disabled-after-failure": "失败后已禁用",
"com.affine.settings.workspace.byok.status.key-verified": "密钥已验证",
"com.affine.settings.workspace.byok.status.key-test-failed": "密钥测试失败",
"com.affine.settings.workspace.byok.capability.text": "文本",
"com.affine.settings.workspace.byok.capability.image-input": "图片输入",
"com.affine.settings.workspace.byok.capability.actions": "动作",
@@ -1504,8 +1498,6 @@
"com.affine.settings.workspace.byok.capability.transcript": "转录",
"com.affine.settings.workspace.byok.capability.indexing": "索引",
"com.affine.settings.workspace.byok.row.activity.failed": "{{date}} 失败",
"com.affine.settings.workspace.byok.row.activity.used": "{{date}} 使用",
"com.affine.settings.workspace.byok.row.activity.used-today": "今天使用",
"com.affine.settings.workspace.byok.row.activity.unused": "尚未使用",
"com.affine.settings.workspace.byok.coverage.title": "功能覆盖",
"com.affine.settings.workspace.byok.feature.chat.title": "写作与聊天",
@@ -1523,23 +1515,17 @@
"com.affine.settings.workspace.byok.usage.title": "BYOK 用量",
"com.affine.settings.workspace.byok.usage.period": "最近 30 天",
"com.affine.settings.workspace.byok.usage.tokens": "{{count}} tokens",
"com.affine.settings.workspace.byok.modal.add-title": "添加服务商密钥",
"com.affine.settings.workspace.byok.modal.edit-title": "编辑服务商密钥",
"com.affine.settings.workspace.byok.modal.description": "重新输入 API key 并测试通过后才能保存更改。",
"com.affine.settings.workspace.byok.field.provider": "服务商",
"com.affine.settings.workspace.byok.field.key-name": "密钥名称",
"com.affine.settings.workspace.byok.field.description": "描述",
"com.affine.settings.workspace.byok.field.storage": "密钥存储",
"com.affine.settings.workspace.byok.field.api-key": "API key",
"com.affine.settings.workspace.byok.field.endpoint": "Endpoint",
"com.affine.settings.workspace.byok.endpoint.custom-disabled": "服务器管理员已禁用自定义端点。请在自托管管理后台启用 copilot.byok.allowCustomEndpoint。",
"com.affine.settings.workspace.byok.endpoint.private-disabled": "私有网络端点还需要服务器管理员启用 copilot.byok.allowPrivateEndpoint。",
"com.affine.settings.workspace.byok.placeholder.key-name": "Primary",
"com.affine.settings.workspace.byok.placeholder.description": "工作区回退密钥",
"com.affine.settings.workspace.byok.action.add-key": "添加密钥",
"com.affine.settings.workspace.byok.action.test-key": "测试密钥",
"com.affine.settings.workspace.byok.action.test": "测试",
"com.affine.settings.workspace.byok.action.testing": "测试中…",
"com.affine.settings.workspace.byok.action.cancel": "取消",
"com.affine.settings.workspace.byok.action.save-key": "保存密钥",
"com.affine.settings.workspace.byok.action.clear-all": "清空所有 BYOK 密钥",
"com.affine.settings.workspace.byok.action.reorder": "重新排序",
"com.affine.settings.workspace.byok.action.edit": "编辑",
@@ -1552,6 +1538,8 @@
"com.affine.settings.workspace.byok.notify.delete-failed.title": "BYOK 密钥未删除",
"com.affine.settings.workspace.byok.notify.reorder-failed.title": "BYOK 密钥未重新排序",
"com.affine.settings.workspace.byok.notify.clear-failed.title": "BYOK 密钥未清空",
"com.affine.settings.workspace.byok.notify.reload-required.title": "BYOK 设置已变化",
"com.affine.settings.workspace.byok.notify.reload-required.message": "请重新加载设置后再试。",
"com.affine.settings.workspace.byok.notify.operation-failed.message": "请稍后重试。",
"com.affine.settings.workspace.byok.notify.cross-storage-reorder.title": "不能跨存储排序",
"com.affine.settings.workspace.byok.notify.cross-storage-reorder.message": "本地密钥和服务端密钥会保留各自独立的回退顺序。",