feat(server): refactor for byok (#14911)

This commit is contained in:
DarkSky
2026-05-07 04:03:14 +08:00
committed by GitHub
parent 4e169ea5c7
commit eb9cc22502
115 changed files with 10369 additions and 1256 deletions
@@ -1,26 +1,26 @@
{
"ar": 100,
"ca": 97,
"ar": 97,
"ca": 94,
"da": 4,
"de": 100,
"el-GR": 96,
"de": 97,
"el-GR": 93,
"en": 100,
"es-AR": 96,
"es-CL": 97,
"es": 96,
"fa": 96,
"fr": 100,
"es-AR": 93,
"es-CL": 94,
"es": 93,
"fa": 93,
"fr": 97,
"hi": 1,
"it": 97,
"ja": 96,
"ko": 97,
"nb-NO": 47,
"pl": 97,
"pt-BR": 96,
"ru": 98,
"sv-SE": 96,
"uk": 96,
"it": 94,
"ja": 93,
"ko": 94,
"nb-NO": 46,
"pl": 94,
"pt-BR": 93,
"ru": 95,
"sv-SE": 93,
"uk": 93,
"ur": 2,
"zh-Hans": 97,
"zh-Hant": 96
"zh-Hans": 98,
"zh-Hant": 93
}
+310
View File
@@ -5891,6 +5891,316 @@ export function useAFFiNEI18N(): {
* `You can view current workspace's information here.`
*/
["com.affine.settings.workspace.description"](): string;
/**
* `AI BYOK (Beta)`
*/
["com.affine.settings.workspace.byok.title-beta"](): string;
/**
* `AI BYOK`
*/
["com.affine.settings.workspace.byok.title"](): string;
/**
* `Loading provider keys.`
*/
["com.affine.settings.workspace.byok.loading"](): string;
/**
* `Use your own provider keys for this workspace.`
*/
["com.affine.settings.workspace.byok.subtitle"](): string;
/**
* `Use workspace provider keys before AFFiNE AI plan routes.`
*/
["com.affine.settings.workspace.byok.header"](): string;
/**
* `BYOK requires Pro, Team, or Believer`
*/
["com.affine.settings.workspace.byok.locked.title"](): string;
/**
* `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`
*/
["com.affine.settings.workspace.byok.keys.title"](): string;
/**
* `List order controls fallback within each storage group.`
*/
["com.affine.settings.workspace.byok.keys.description"](): string;
/**
* `No provider keys`
*/
["com.affine.settings.workspace.byok.empty.title"](): string;
/**
* `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.empty.description"](): string;
/**
* `Local`
*/
["com.affine.settings.workspace.byok.storage.local"](): string;
/**
* `Server`
*/
["com.affine.settings.workspace.byok.storage.server"](): string;
/**
* `Local (this device)`
*/
["com.affine.settings.workspace.byok.storage.local-this-device"](): string;
/**
* `Local (Desktop only)`
*/
["com.affine.settings.workspace.byok.storage.local-desktop-only"](): string;
/**
* `Disabled after failure`
*/
["com.affine.settings.workspace.byok.status.disabled-after-failure"](): string;
/**
* `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`
*/
["com.affine.settings.workspace.byok.capability.text"](): string;
/**
* `Image input`
*/
["com.affine.settings.workspace.byok.capability.image-input"](): string;
/**
* `Actions`
*/
["com.affine.settings.workspace.byok.capability.actions"](): string;
/**
* `Image generate`
*/
["com.affine.settings.workspace.byok.capability.image-generate"](): string;
/**
* `Transcript`
*/
["com.affine.settings.workspace.byok.capability.transcript"](): string;
/**
* `Indexing`
*/
["com.affine.settings.workspace.byok.capability.indexing"](): string;
/**
* `failed {{date}}`
*/
["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`
*/
["com.affine.settings.workspace.byok.row.activity.unused"](): string;
/**
* `Feature coverage`
*/
["com.affine.settings.workspace.byok.coverage.title"](): string;
/**
* `Writing and chat`
*/
["com.affine.settings.workspace.byok.feature.chat.title"](): string;
/**
* `Covered when an OpenAI, Anthropic, or Gemini BYOK key exists.`
*/
["com.affine.settings.workspace.byok.feature.chat.fallback"](): string;
/**
* `Actions and structured output`
*/
["com.affine.settings.workspace.byok.feature.action.title"](): string;
/**
* `Covered when an OpenAI or Gemini BYOK key exists.`
*/
["com.affine.settings.workspace.byok.feature.action.fallback"](): string;
/**
* `Image generation`
*/
["com.affine.settings.workspace.byok.feature.image.title"](): string;
/**
* `Covered when an OpenAI, Gemini, or FAL BYOK key exists.`
*/
["com.affine.settings.workspace.byok.feature.image.fallback"](): string;
/**
* `Transcript`
*/
["com.affine.settings.workspace.byok.feature.transcript.title"](): string;
/**
* `Covered when a server Gemini BYOK key exists.`
*/
["com.affine.settings.workspace.byok.feature.transcript.fallback"](): string;
/**
* `Workspace indexing`
*/
["com.affine.settings.workspace.byok.feature.workspace-indexing.title"](): string;
/**
* `Covered when a server Gemini BYOK key exists.`
*/
["com.affine.settings.workspace.byok.feature.workspace-indexing.fallback"](): string;
/**
* `Transcript and workspace indexing require a server Gemini BYOK key or AFFiNE AI plan fallback.`
*/
["com.affine.settings.workspace.byok.warning.transcript"](): string;
/**
* `Workspace indexing requires a server Gemini BYOK key or AFFiNE AI plan fallback.`
*/
["com.affine.settings.workspace.byok.warning.workspace-indexing"](): string;
/**
* `BYOK usage`
*/
["com.affine.settings.workspace.byok.usage.title"](): string;
/**
* `Last 30 days`
*/
["com.affine.settings.workspace.byok.usage.period"](): string;
/**
* `{{count}} tokens`
*/
["com.affine.settings.workspace.byok.usage.tokens"](options: {
readonly count: string;
}): string;
/**
* `Add provider key`
*/
["com.affine.settings.workspace.byok.modal.add-title"](): string;
/**
* `Edit provider key`
*/
["com.affine.settings.workspace.byok.modal.edit-title"](): string;
/**
* `Re-enter the API key and test it before saving changes.`
*/
["com.affine.settings.workspace.byok.modal.description"](): string;
/**
* `Provider`
*/
["com.affine.settings.workspace.byok.field.provider"](): string;
/**
* `Key name`
*/
["com.affine.settings.workspace.byok.field.key-name"](): string;
/**
* `Description`
*/
["com.affine.settings.workspace.byok.field.description"](): string;
/**
* `Key storage`
*/
["com.affine.settings.workspace.byok.field.storage"](): string;
/**
* `API key`
*/
["com.affine.settings.workspace.byok.field.api-key"](): string;
/**
* `Endpoint`
*/
["com.affine.settings.workspace.byok.field.endpoint"](): string;
/**
* `Primary`
*/
["com.affine.settings.workspace.byok.placeholder.key-name"](): string;
/**
* `Workspace fallback key`
*/
["com.affine.settings.workspace.byok.placeholder.description"](): string;
/**
* `Add key`
*/
["com.affine.settings.workspace.byok.action.add-key"](): string;
/**
* `Test key`
*/
["com.affine.settings.workspace.byok.action.test-key"](): string;
/**
* `Cancel`
*/
["com.affine.settings.workspace.byok.action.cancel"](): string;
/**
* `Save key`
*/
["com.affine.settings.workspace.byok.action.save-key"](): string;
/**
* `Clear all BYOK keys`
*/
["com.affine.settings.workspace.byok.action.clear-all"](): string;
/**
* `Reorder`
*/
["com.affine.settings.workspace.byok.action.reorder"](): string;
/**
* `Edit`
*/
["com.affine.settings.workspace.byok.action.edit"](): string;
/**
* `Delete`
*/
["com.affine.settings.workspace.byok.action.delete"](): string;
/**
* `Key test failed`
*/
["com.affine.settings.workspace.byok.notify.test-failed.title"](): string;
/**
* `Local key not saved`
*/
["com.affine.settings.workspace.byok.notify.local-save-failed.title"](): string;
/**
* `Secure device storage is unavailable.`
*/
["com.affine.settings.workspace.byok.notify.local-save-failed.message"](): string;
/**
* `BYOK settings not loaded`
*/
["com.affine.settings.workspace.byok.notify.load-failed.title"](): string;
/**
* `BYOK key not saved`
*/
["com.affine.settings.workspace.byok.notify.save-failed.title"](): string;
/**
* `BYOK key not deleted`
*/
["com.affine.settings.workspace.byok.notify.delete-failed.title"](): string;
/**
* `BYOK keys not reordered`
*/
["com.affine.settings.workspace.byok.notify.reorder-failed.title"](): string;
/**
* `BYOK keys not cleared`
*/
["com.affine.settings.workspace.byok.notify.clear-failed.title"](): string;
/**
* `Please try again.`
*/
["com.affine.settings.workspace.byok.notify.operation-failed.message"](): string;
/**
* `Cannot reorder across storage`
*/
["com.affine.settings.workspace.byok.notify.cross-storage-reorder.title"](): string;
/**
* `Local keys and server keys keep separate fallback order.`
*/
["com.affine.settings.workspace.byok.notify.cross-storage-reorder.message"](): string;
/**
* `Experimental features`
*/
@@ -1471,6 +1471,82 @@
"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.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.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",
"com.affine.settings.workspace.byok.capability.image-generate": "Image generate",
"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",
"com.affine.settings.workspace.byok.feature.chat.fallback": "Covered when an OpenAI, Anthropic, or Gemini BYOK key exists.",
"com.affine.settings.workspace.byok.feature.action.title": "Actions and structured output",
"com.affine.settings.workspace.byok.feature.action.fallback": "Covered when an OpenAI or Gemini BYOK key exists.",
"com.affine.settings.workspace.byok.feature.image.title": "Image generation",
"com.affine.settings.workspace.byok.feature.image.fallback": "Covered when an OpenAI, Gemini, or FAL BYOK key exists.",
"com.affine.settings.workspace.byok.feature.transcript.title": "Transcript",
"com.affine.settings.workspace.byok.feature.transcript.fallback": "Covered when a server Gemini BYOK key exists.",
"com.affine.settings.workspace.byok.feature.workspace-indexing.title": "Workspace indexing",
"com.affine.settings.workspace.byok.feature.workspace-indexing.fallback": "Covered when a server Gemini BYOK key exists.",
"com.affine.settings.workspace.byok.warning.transcript": "Transcript and workspace indexing require a server Gemini BYOK key or AFFiNE AI plan fallback.",
"com.affine.settings.workspace.byok.warning.workspace-indexing": "Workspace indexing requires a server Gemini BYOK key or AFFiNE AI plan fallback.",
"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.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.api-key": "API key",
"com.affine.settings.workspace.byok.field.endpoint": "Endpoint",
"com.affine.settings.workspace.byok.placeholder.key-name": "Primary",
"com.affine.settings.workspace.byok.placeholder.description": "Workspace fallback key",
"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.cancel": "Cancel",
"com.affine.settings.workspace.byok.action.save-key": "Save key",
"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",
"com.affine.settings.workspace.byok.action.delete": "Delete",
"com.affine.settings.workspace.byok.notify.test-failed.title": "Key test failed",
"com.affine.settings.workspace.byok.notify.local-save-failed.title": "Local key not saved",
"com.affine.settings.workspace.byok.notify.local-save-failed.message": "Secure device storage is unavailable.",
"com.affine.settings.workspace.byok.notify.load-failed.title": "BYOK settings not loaded",
"com.affine.settings.workspace.byok.notify.save-failed.title": "BYOK key not saved",
"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.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.",
"com.affine.settings.workspace.experimental-features": "Experimental features",
"com.affine.settings.workspace.experimental-features.get-started": "Get started",
"com.affine.settings.workspace.experimental-features.header.plugins": "Experimental features",
@@ -1438,6 +1438,82 @@
"com.affine.settings.meetings.record.permission-modal.open-setting": "打开系统设置",
"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": "动作",
"com.affine.settings.workspace.byok.capability.image-generate": "图片生成",
"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": "写作与聊天",
"com.affine.settings.workspace.byok.feature.chat.fallback": "存在 OpenAI、Anthropic 或 Gemini BYOK 密钥时覆盖。",
"com.affine.settings.workspace.byok.feature.action.title": "动作与结构化输出",
"com.affine.settings.workspace.byok.feature.action.fallback": "存在 OpenAI 或 Gemini BYOK 密钥时覆盖。",
"com.affine.settings.workspace.byok.feature.image.title": "图片生成",
"com.affine.settings.workspace.byok.feature.image.fallback": "存在 OpenAI、Gemini 或 FAL BYOK 密钥时覆盖。",
"com.affine.settings.workspace.byok.feature.transcript.title": "转录",
"com.affine.settings.workspace.byok.feature.transcript.fallback": "存在服务端 Gemini BYOK 密钥时覆盖。",
"com.affine.settings.workspace.byok.feature.workspace-indexing.title": "工作区索引",
"com.affine.settings.workspace.byok.feature.workspace-indexing.fallback": "存在服务端 Gemini BYOK 密钥时覆盖。",
"com.affine.settings.workspace.byok.warning.transcript": "转录和工作区索引需要服务端 Gemini BYOK 密钥,或回退到 AFFiNE AI 套餐。",
"com.affine.settings.workspace.byok.warning.workspace-indexing": "工作区索引需要服务端 Gemini BYOK 密钥,或回退到 AFFiNE AI 套餐。",
"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.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.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": "编辑",
"com.affine.settings.workspace.byok.action.delete": "删除",
"com.affine.settings.workspace.byok.notify.test-failed.title": "密钥测试失败",
"com.affine.settings.workspace.byok.notify.local-save-failed.title": "本地密钥未保存",
"com.affine.settings.workspace.byok.notify.local-save-failed.message": "安全设备存储不可用。",
"com.affine.settings.workspace.byok.notify.load-failed.title": "BYOK 设置未加载",
"com.affine.settings.workspace.byok.notify.save-failed.title": "BYOK 密钥未保存",
"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.operation-failed.message": "请稍后重试。",
"com.affine.settings.workspace.byok.notify.cross-storage-reorder.title": "不能跨存储排序",
"com.affine.settings.workspace.byok.notify.cross-storage-reorder.message": "本地密钥和服务端密钥会保留各自独立的回退顺序。",
"com.affine.settings.workspace.experimental-features": "实验性功能",
"com.affine.settings.workspace.experimental-features.get-started": "开始使用",
"com.affine.settings.workspace.experimental-features.header.plugins": "实验性功能",