fix(omo): replace hardcoded isZh strings with proper i18n t() calls

This commit is contained in:
YoVinchen
2026-02-08 23:41:48 +08:00
parent a20ff157bf
commit 6388d24c9a
5 changed files with 204 additions and 59 deletions
+1 -1
View File
@@ -797,7 +797,7 @@ function App() {
setSettingsDefaultTab("usage");
setCurrentView("settings");
}}
title={t("settings.usage.title", {
title={t("usage.title", {
defaultValue: "使用统计",
})}
className="hover:bg-black/5 dark:hover:bg-white/5"
@@ -119,7 +119,7 @@ export function OmoFormFields({
otherFieldsStr,
onOtherFieldsStrChange,
}: OmoFormFieldsProps) {
const { i18n } = useTranslation();
const { t, i18n } = useTranslation();
const isZh = i18n.language?.startsWith("zh");
const [mainAgentsOpen, setMainAgentsOpen] = useState(true);
@@ -183,14 +183,15 @@ export function OmoFormFields({
return [
{
value: currentModel,
label: isZh
? `${currentModel}(当前值,未启用)`
: `${currentModel} (current value, not enabled)`,
label: t("omo.currentValueNotEnabled", {
value: currentModel,
defaultValue: "{{value}} (current value, not enabled)",
}),
},
...modelOptions,
];
},
[isZh, modelOptions],
[modelOptions, t],
);
const resolveRecommendedModel = useCallback(
@@ -224,17 +225,20 @@ export function OmoFormFields({
<SelectTrigger className="flex-1 h-8 text-sm">
<SelectValue
placeholder={
placeholder || (isZh ? "选择已启用模型" : "Select enabled model")
placeholder ||
t("omo.selectEnabledModel", {
defaultValue: "Select enabled model",
})
}
/>
</SelectTrigger>
<SelectContent className="max-h-72">
<SelectItem value={EMPTY_MODEL_VALUE}>
{isZh ? "(清空)" : "(Clear)"}
{t("omo.clearWrapped", { defaultValue: "(Clear)" })}
</SelectItem>
{options.length === 0 ? (
<SelectItem value={UNAVAILABLE_MODEL_VALUE} disabled>
{isZh ? "暂无已启用模型" : "No enabled models"}
{t("omo.noEnabledModels", { defaultValue: "No enabled models" })}
</SelectItem>
) : (
options.map((option) => (
@@ -282,27 +286,36 @@ export function OmoFormFields({
disabled={!hasModel}
>
<SelectTrigger className="w-32 h-8 text-xs shrink-0">
<SelectValue placeholder="variant" />
<SelectValue
placeholder={t("omo.variantPlaceholder", {
defaultValue: "variant",
})}
/>
</SelectTrigger>
<SelectContent className="max-h-72">
<SelectItem value={EMPTY_VARIANT_VALUE}>
{isZh ? "(默认)" : "(Default)"}
{t("omo.defaultWrapped", { defaultValue: "(Default)" })}
</SelectItem>
{!hasModel ? (
<SelectItem value={UNAVAILABLE_VARIANT_VALUE} disabled>
{isZh ? "先选择模型" : "Select model first"}
{t("omo.selectModelFirst", {
defaultValue: "Select model first",
})}
</SelectItem>
) : variantOptions.length === 0 ? (
<SelectItem value={UNAVAILABLE_VARIANT_VALUE} disabled>
{isZh ? "该模型无思考等级" : "No variants for model"}
{t("omo.noVariantsForModel", {
defaultValue: "No variants for model",
})}
</SelectItem>
) : (
variantOptions.map((variant, index) => (
<SelectItem key={`${variant}-${index}`} value={variant}>
{firstIsUnavailable && index === 0
? isZh
? `${variant}(当前值,未启用)`
: `${variant} (current value, unavailable)`
? t("omo.currentValueUnavailable", {
value: variant,
defaultValue: "{{value}} (current value, unavailable)",
})
: variant}
</SelectItem>
))
@@ -498,7 +511,9 @@ export function OmoFormFields({
onBlur={(e) => {
if (!handleAdvancedChange(configKey, e.target.value, store, setter)) {
toast.error(
isZh ? "高级参数 JSON 无效" : "Advanced JSON is invalid",
t("omo.advancedJsonInvalid", {
defaultValue: "Advanced JSON is invalid",
}),
);
}
}}
@@ -507,9 +522,10 @@ export function OmoFormFields({
/>
{showHint && (
<p className="text-[10px] text-muted-foreground mt-1">
{isZh
? "temperature, top_p, budgetTokens, prompt_append, permission 等,留空使用默认值"
: "temperature, top_p, budgetTokens, prompt_append, permission, etc. Leave empty for defaults"}
{t("omo.advancedJsonHint", {
defaultValue:
"temperature, top_p, budgetTokens, prompt_append, permission, etc. Leave empty for defaults",
})}
</p>
)}
</div>
@@ -518,9 +534,10 @@ export function OmoFormFields({
const handleFillAllRecommended = () => {
if (modelOptions.length === 0) {
toast.warning(
isZh
? "当前没有可用的已启用模型,请先启用并配置 OpenCode 模型"
: "No enabled models available. Configure and enable OpenCode models first.",
t("omo.noEnabledModelsWarning", {
defaultValue:
"No enabled models available. Configure and enable OpenCode models first.",
}),
);
return;
}
@@ -582,15 +599,17 @@ export function OmoFormFields({
);
setLocalFilePath(data.filePath);
toast.success(
isZh
? "已从本地文件导入并覆盖 Agent/Category/Other Fields"
: "Imported local file and replaced Agents/Categories/Other Fields",
t("omo.importLocalReplaceSuccess", {
defaultValue:
"Imported local file and replaced Agents/Categories/Other Fields",
}),
);
} catch (err) {
toast.error(
isZh
? `读取本地文件失败: ${String(err)}`
: `Failed to read local file: ${String(err)}`,
t("omo.importLocalFailed", {
error: String(err),
defaultValue: "Failed to read local file: {{error}}",
}),
);
}
}, [
@@ -598,7 +617,7 @@ export function OmoFormFields({
onAgentsChange,
onCategoriesChange,
onOtherFieldsStrChange,
isZh,
t,
]);
const renderBuiltinModelRow = (
@@ -641,7 +660,7 @@ export function OmoFormFields({
size="icon"
className={cn("h-7 w-7 shrink-0", advStr && "text-primary")}
onClick={() => toggleAdvancedEditor(scope, key, advStr, isExpanded)}
title={isZh ? "高级参数" : "Advanced"}
title={t("omo.advancedLabel", { defaultValue: "Advanced" })}
>
<Settings className="h-3.5 w-3.5" />
</Button>
@@ -683,12 +702,8 @@ export function OmoFormFields({
const rowPrefix = isAgent ? "custom-agent" : "custom-cat";
const emptyKeyPrefix = isAgent ? "__custom_agent_" : "__custom_cat_";
const keyPlaceholder = isAgent
? isZh
? "agent 键名"
: "agent key"
: isZh
? "分类键名"
: "category key";
? t("omo.agentKeyPlaceholder", { defaultValue: "agent key" })
: t("omo.categoryKeyPlaceholder", { defaultValue: "category key" });
const key = item.key || `${emptyKeyPrefix}${index}`;
const currentVariant =
@@ -721,7 +736,7 @@ export function OmoFormFields({
{renderModelSelect(
item.model,
(value) => updateCustom({ model: value }),
"model-name",
t("omo.modelNamePlaceholder", { defaultValue: "model-name" }),
)}
{renderVariantSelect(item.model, currentVariant, (value) => {
if (!item.key) return;
@@ -733,7 +748,7 @@ export function OmoFormFields({
size="icon"
className={cn("h-7 w-7 shrink-0", advStr && "text-primary")}
onClick={() => toggleAdvancedEditor(scope, key, advStr, isExpanded)}
title={isZh ? "高级参数" : "Advanced"}
title={t("omo.advancedLabel", { defaultValue: "Advanced" })}
>
<Settings className="h-3.5 w-3.5" />
</Button>
@@ -848,7 +863,7 @@ export function OmoFormFields({
onClick={onClick}
>
<Plus className="h-3.5 w-3.5 mr-1" />
{isZh ? "自定义" : "Custom"}
{t("omo.custom", { defaultValue: "Custom" })}
</Button>
);
@@ -874,7 +889,7 @@ export function OmoFormFields({
<div className="space-y-2">
<div className="flex items-center justify-between">
<Label className="text-sm font-semibold">
{isZh ? "模型配置" : "Model Configuration"}
{t("omo.modelConfiguration", { defaultValue: "Model Configuration" })}
</Label>
<div className="flex items-center gap-1.5">
<Button
@@ -890,7 +905,7 @@ export function OmoFormFields({
) : (
<FolderInput className="h-3.5 w-3.5 mr-1" />
)}
{isZh ? "从本地导入" : "Import Local"}
{t("omo.importLocal", { defaultValue: "Import Local" })}
</Button>
<Button
type="button"
@@ -900,24 +915,28 @@ export function OmoFormFields({
onClick={handleFillAllRecommended}
>
<Wand2 className="h-3.5 w-3.5 mr-1" />
{isZh ? "填充推荐" : "Fill Recommended"}
{t("omo.fillRecommended", { defaultValue: "Fill Recommended" })}
</Button>
</div>
</div>
<div className="text-xs text-muted-foreground">
{isZh
? `已配置 ${configuredAgentCount} 个 Agent${configuredCategoryCount} 个 Category · 点击 ⚙ 展开高级参数`
: `${configuredAgentCount} agents, ${configuredCategoryCount} categories configured · Click ⚙ for advanced params`}
{t("omo.configSummary", {
agents: configuredAgentCount,
categories: configuredCategoryCount,
defaultValue:
"{{agents}} agents, {{categories}} categories configured · Click ⚙ for advanced params",
})}
<span className="ml-1">
·{" "}
{isZh
? `可选已启用模型 ${modelOptions.length}`
: `${modelOptions.length} enabled models available`}
{t("omo.enabledModelsCount", {
count: modelOptions.length,
defaultValue: "{{count}} enabled models available",
})}
</span>
{localFilePath && (
<span className="ml-1 text-primary/70">
· {isZh ? "来源:" : "from:"}{" "}
· {t("omo.source", { defaultValue: "from:" })}{" "}
<span className="font-mono text-[10px]">
{localFilePath.replace(/^.*\//, "")}
</span>
@@ -926,7 +945,7 @@ export function OmoFormFields({
</div>
{renderModelSection({
title: isZh ? "主 Agents" : "Main Agents",
title: t("omo.mainAgents", { defaultValue: "Main Agents" }),
isOpen: mainAgentsOpen,
onToggle: () => setMainAgentsOpen(!mainAgentsOpen),
badge: `${mainAgents.length}`,
@@ -934,7 +953,7 @@ export function OmoFormFields({
})}
{renderModelSection({
title: isZh ? "子 Agents" : "Sub Agents",
title: t("omo.subAgents", { defaultValue: "Sub Agents" }),
isOpen: subAgentsOpen,
onToggle: () => setSubAgentsOpen(!subAgentsOpen),
badge: `${subAgents.length + customAgents.length}`,
@@ -944,7 +963,9 @@ export function OmoFormFields({
{subAgents.map(renderAgentRow)}
{customAgents.length > 0 && (
<>
{renderCustomDivider(isZh ? "自定义 Agents" : "Custom Agents")}
{renderCustomDivider(
t("omo.customAgents", { defaultValue: "Custom Agents" }),
)}
{customAgents.map((a, i) =>
renderCustomModelRow("agent", a, i),
)}
@@ -955,7 +976,7 @@ export function OmoFormFields({
})}
{renderModelSection({
title: isZh ? "分类 (Categories)" : "Categories",
title: t("omo.categories", { defaultValue: "Categories" }),
isOpen: categoriesOpen,
onToggle: () => setCategoriesOpen(!categoriesOpen),
badge: `${OMO_BUILTIN_CATEGORIES.length + customCategories.length}`,
@@ -965,7 +986,11 @@ export function OmoFormFields({
{OMO_BUILTIN_CATEGORIES.map(renderCategoryRow)}
{customCategories.length > 0 && (
<>
{renderCustomDivider(isZh ? "自定义分类" : "Custom Categories")}
{renderCustomDivider(
t("omo.customCategories", {
defaultValue: "Custom Categories",
}),
)}
{customCategories.map((c, i) =>
renderCustomModelRow("category", c, i),
)}
@@ -976,7 +1001,9 @@ export function OmoFormFields({
})}
{renderModelSection({
title: isZh ? "其他字段 (JSON)" : "Other Fields (JSON)",
title: t("omo.otherFieldsJson", {
defaultValue: "Other Fields (JSON)",
}),
isOpen: otherFieldsOpen,
onToggle: () => setOtherFieldsOpen(!otherFieldsOpen),
badge:
+38 -1
View File
@@ -32,6 +32,7 @@
"back": "Back",
"refresh": "Refresh",
"refreshing": "Refreshing...",
"import": "Import",
"all": "All",
"search": "Search",
"reset": "Reset",
@@ -106,6 +107,10 @@
"duplicate": "Duplicate",
"sortUpdateFailed": "Failed to update sort order",
"configureUsage": "Configure usage query",
"officialPartner": "Official Partner",
"openTerminal": "Open Terminal",
"terminalOpened": "Terminal opened",
"terminalOpenFailed": "Failed to open terminal",
"name": "Provider Name",
"namePlaceholder": "e.g., Claude Official",
"websiteUrl": "Website URL",
@@ -156,7 +161,8 @@
"deleteFailed": "Failed to delete provider: {{error}}",
"settingsSaved": "Settings saved",
"settingsSaveFailed": "Failed to save settings: {{error}}",
"openAIChatFormatHint": "This provider uses OpenAI Chat format and requires the proxy service to be enabled"
"openAIChatFormatHint": "This provider uses OpenAI Chat format and requires the proxy service to be enabled",
"openLinkFailed": "Failed to open link"
},
"confirm": {
"deleteProvider": "Delete Provider",
@@ -478,6 +484,7 @@
"aggregatorApiKeyHint": "💡 Only need to fill in API Key, endpoint is preset",
"thirdPartyApiKeyHint": "💡 Only need to fill in API Key, endpoint is preset",
"customApiKeyHint": "💡 Custom configuration requires manually filling all necessary fields",
"omoHint": "💡 OMO config manages Agent model assignments and writes to oh-my-opencode.jsonc",
"officialHint": "💡 Official provider uses browser login, no API Key needed",
"getApiKey": "Get API Key",
"partnerPromotion": {
@@ -1267,6 +1274,9 @@
"agents": {
"title": "Agents"
},
"modelTest": {
"testProvider": "Test model"
},
"health": {
"operational": "Operational",
"degraded": "Degraded",
@@ -1505,6 +1515,7 @@
"deleted": "Universal provider deleted",
"addSuccess": "Universal provider added successfully",
"addFailed": "Failed to add universal provider",
"hint": "Cross-app unified config, auto-sync to Claude/Codex/Gemini",
"manage": "Manage",
"loadError": "Failed to load universal providers",
"saveError": "Failed to save universal provider",
@@ -1558,6 +1569,32 @@
"commonConfigHint": "OMO common config will be merged into all OMO configs that enable it",
"selectPlaceholder": "Select...",
"clear": "Clear",
"clearWrapped": "(Clear)",
"defaultWrapped": "(Default)",
"variantPlaceholder": "variant",
"selectEnabledModel": "Select enabled model",
"selectModelFirst": "Select model first",
"noEnabledModels": "No enabled models",
"noVariantsForModel": "No variants for model",
"currentValueNotEnabled": "{{value}} (current value, not enabled)",
"currentValueUnavailable": "{{value}} (current value, unavailable)",
"advancedLabel": "Advanced",
"advancedJsonInvalid": "Advanced JSON is invalid",
"advancedJsonHint": "temperature, top_p, budgetTokens, prompt_append, permission, etc. Leave empty for defaults",
"noEnabledModelsWarning": "No enabled models available. Configure and enable OpenCode models first.",
"importLocalReplaceSuccess": "Imported local file and replaced Agents/Categories/Other Fields",
"importLocalFailed": "Failed to read local file: {{error}}",
"agentKeyPlaceholder": "agent key",
"categoryKeyPlaceholder": "category key",
"modelNamePlaceholder": "model-name",
"custom": "Custom",
"customCategories": "Custom Categories",
"modelConfiguration": "Model Configuration",
"fillRecommended": "Fill Recommended",
"configSummary": "{{agents}} agents, {{categories}} categories configured · Click ⚙ for advanced params",
"enabledModelsCount": "{{count}} enabled models available",
"source": "from:",
"otherFieldsJson": "Other Fields (JSON)",
"searchOrType": "Search or type custom value...",
"noMatches": "No matches",
"jsonMustBeObject": "{{field}} must be a JSON object",
+45 -1
View File
@@ -32,6 +32,7 @@
"back": "戻る",
"refresh": "更新",
"refreshing": "更新中...",
"import": "インポート",
"all": "すべて",
"search": "検索",
"reset": "リセット",
@@ -106,6 +107,10 @@
"duplicate": "複製",
"sortUpdateFailed": "並び順の更新に失敗しました",
"configureUsage": "利用状況を設定",
"officialPartner": "公式パートナー",
"openTerminal": "ターミナルを開く",
"terminalOpened": "ターミナルを開きました",
"terminalOpenFailed": "ターミナルを開けませんでした",
"name": "プロバイダー名",
"namePlaceholder": "例: Claude Official",
"websiteUrl": "Web サイト URL",
@@ -156,7 +161,8 @@
"deleteFailed": "プロバイダーの削除に失敗しました: {{error}}",
"settingsSaved": "設定を保存しました",
"settingsSaveFailed": "設定の保存に失敗しました: {{error}}",
"openAIChatFormatHint": "このプロバイダーは OpenAI Chat フォーマットを使用しており、プロキシサービスの有効化が必要です"
"openAIChatFormatHint": "このプロバイダーは OpenAI Chat フォーマットを使用しており、プロキシサービスの有効化が必要です",
"openLinkFailed": "リンクを開けませんでした"
},
"confirm": {
"deleteProvider": "プロバイダーを削除",
@@ -478,6 +484,7 @@
"aggregatorApiKeyHint": "💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです",
"thirdPartyApiKeyHint": "💡 API Key のみ入力すれば OK。エンドポイントはプリセット済みです",
"customApiKeyHint": "💡 カスタム設定では必要な項目をすべて手動で入力してください",
"omoHint": "💡 OMO 設定は Agent のモデル割り当てを管理し、oh-my-opencode.jsonc に書き込みます",
"officialHint": "💡 公式プロバイダーはブラウザログインで、API Key は不要です",
"getApiKey": "API Key を取得",
"partnerPromotion": {
@@ -1161,6 +1168,13 @@
"codex": "Codex",
"gemini": "Gemini",
"opencode": "OpenCode"
},
"installFromZip": {
"button": "ZIP からインストール",
"installing": "インストール中...",
"successSingle": "スキル {{name}} をインストールしました",
"successMultiple": "{{count}} 件のスキルをインストールしました",
"noSkillsFound": "ZIP ファイルにスキルが見つかりません(SKILL.md が必要です)"
}
},
"deeplink": {
@@ -1258,6 +1272,9 @@
"agents": {
"title": "エージェント"
},
"modelTest": {
"testProvider": "モデルテスト"
},
"health": {
"operational": "正常",
"degraded": "低下",
@@ -1479,6 +1496,7 @@
"deleted": "統合プロバイダーを削除しました",
"addSuccess": "統合プロバイダーを追加しました",
"addFailed": "統合プロバイダーの追加に失敗しました",
"hint": "クロスアプリ統合設定。Claude/Codex/Gemini に自動同期します",
"manage": "管理",
"loadError": "統合プロバイダーの読み込みに失敗しました",
"saveError": "統合プロバイダーの保存に失敗しました",
@@ -1532,6 +1550,32 @@
"commonConfigHint": "OMO 共通設定は有効にしたすべての OMO 設定に統合されます",
"selectPlaceholder": "選択してください...",
"clear": "クリア",
"clearWrapped": "(クリア)",
"defaultWrapped": "(デフォルト)",
"variantPlaceholder": "variant",
"selectEnabledModel": "有効なモデルを選択",
"selectModelFirst": "先にモデルを選択",
"noEnabledModels": "有効なモデルがありません",
"noVariantsForModel": "このモデルには思考レベルがありません",
"currentValueNotEnabled": "{{value}} (現在値・未有効)",
"currentValueUnavailable": "{{value}} (現在値・利用不可)",
"advancedLabel": "詳細",
"advancedJsonInvalid": "詳細 JSON が不正です",
"advancedJsonHint": "temperature, top_p, budgetTokens, prompt_append, permission など。空欄でデフォルトを使用します",
"noEnabledModelsWarning": "利用可能な有効モデルがありません。先に OpenCode モデルを有効化してください。",
"importLocalReplaceSuccess": "ローカルファイルから読み込み、Agents/Categories/Other Fields を置き換えました",
"importLocalFailed": "ローカルファイルの読み込みに失敗しました: {{error}}",
"agentKeyPlaceholder": "agent キー",
"categoryKeyPlaceholder": "カテゴリキー",
"modelNamePlaceholder": "model-name",
"custom": "カスタム",
"customCategories": "カスタムカテゴリ",
"modelConfiguration": "モデル設定",
"fillRecommended": "推奨を入力",
"configSummary": "{{agents}} 個の Agent、{{categories}} 個の Category を設定済み · ⚙ で詳細を展開",
"enabledModelsCount": "有効モデル {{count}} 件",
"source": "出典:",
"otherFieldsJson": "その他のフィールド (JSON)",
"searchOrType": "検索またはカスタム値を入力...",
"noMatches": "一致する項目がありません",
"jsonMustBeObject": "{{field}} は JSON オブジェクトである必要があります",
+38 -1
View File
@@ -32,6 +32,7 @@
"back": "返回",
"refresh": "刷新",
"refreshing": "刷新中...",
"import": "导入",
"all": "全部",
"search": "查询",
"reset": "重置",
@@ -106,6 +107,10 @@
"duplicate": "复制",
"sortUpdateFailed": "排序更新失败",
"configureUsage": "配置用量查询",
"officialPartner": "官方合作伙伴",
"openTerminal": "打开终端",
"terminalOpened": "终端已打开",
"terminalOpenFailed": "打开终端失败",
"name": "供应商名称",
"namePlaceholder": "例如:Claude 官方",
"websiteUrl": "官网链接",
@@ -156,7 +161,8 @@
"deleteFailed": "删除供应商失败:{{error}}",
"settingsSaved": "设置已保存",
"settingsSaveFailed": "保存设置失败:{{error}}",
"openAIChatFormatHint": "此供应商使用 OpenAI Chat 格式,需要开启代理服务才能正常使用"
"openAIChatFormatHint": "此供应商使用 OpenAI Chat 格式,需要开启代理服务才能正常使用",
"openLinkFailed": "链接打开失败"
},
"confirm": {
"deleteProvider": "删除供应商",
@@ -478,6 +484,7 @@
"aggregatorApiKeyHint": "💡 只需填写 API Key,请求地址已预设",
"thirdPartyApiKeyHint": "💡 只需填写 API Key,请求地址已预设",
"customApiKeyHint": "💡 自定义配置需手动填写所有必要字段",
"omoHint": "💡 OMO 配置管理 Agent 模型分配,写入 oh-my-opencode.jsonc",
"officialHint": "💡 官方供应商使用浏览器登录,无需配置 API Key",
"getApiKey": "获取 API Key",
"partnerPromotion": {
@@ -1267,6 +1274,9 @@
"agents": {
"title": "智能体"
},
"modelTest": {
"testProvider": "测试模型"
},
"health": {
"operational": "正常",
"degraded": "降级",
@@ -1505,6 +1515,7 @@
"deleted": "统一供应商已删除",
"addSuccess": "统一供应商添加成功",
"addFailed": "统一供应商添加失败",
"hint": "跨应用统一配置,自动同步到 Claude/Codex/Gemini",
"manage": "管理",
"loadError": "加载统一供应商失败",
"saveError": "保存统一供应商失败",
@@ -1558,6 +1569,32 @@
"commonConfigHint": "OMO 通用配置将合并到所有启用它的 OMO 配置中",
"selectPlaceholder": "请选择...",
"clear": "清空",
"clearWrapped": "(清空)",
"defaultWrapped": "(默认)",
"variantPlaceholder": "思考等级",
"selectEnabledModel": "选择已启用模型",
"selectModelFirst": "先选择模型",
"noEnabledModels": "暂无已启用模型",
"noVariantsForModel": "该模型无思考等级",
"currentValueNotEnabled": "{{value}}(当前值,未启用)",
"currentValueUnavailable": "{{value}}(当前值,未启用)",
"advancedLabel": "高级参数",
"advancedJsonInvalid": "高级参数 JSON 无效",
"advancedJsonHint": "temperature, top_p, budgetTokens, prompt_append, permission 等,留空使用默认值",
"noEnabledModelsWarning": "当前没有可用的已启用模型,请先启用并配置 OpenCode 模型",
"importLocalReplaceSuccess": "已从本地文件导入并覆盖 Agent/Category/Other Fields",
"importLocalFailed": "读取本地文件失败: {{error}}",
"agentKeyPlaceholder": "agent 键名",
"categoryKeyPlaceholder": "分类键名",
"modelNamePlaceholder": "模型名",
"custom": "自定义",
"customCategories": "自定义分类",
"modelConfiguration": "模型配置",
"fillRecommended": "填充推荐",
"configSummary": "已配置 {{agents}} 个 Agent{{categories}} 个 Category · 点击 ⚙ 展开高级参数",
"enabledModelsCount": "可选已启用模型 {{count}} 个",
"source": "来源:",
"otherFieldsJson": "其他字段 (JSON)",
"searchOrType": "搜索或输入自定义值...",
"noMatches": "无匹配项",
"jsonMustBeObject": "{{field}} 必须是 JSON 对象",