mirror of
https://github.com/NanmiCoder/claude-code-haha.git
synced 2026-10-10 11:53:10 +08:00
fix(desktop): rename provider settings to model management across locales
This commit is contained in:
@@ -2190,7 +2190,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
expect(MOCK_DELETE_PROVIDER).not.toHaveBeenCalled()
|
||||
expect(screen.getByRole('dialog')).toBeInTheDocument()
|
||||
expect(screen.getByText('Delete provider "MiniMax-M2.7-highspeed(openai)"? This cannot be undone.')).toBeInTheDocument()
|
||||
expect(screen.getByText('Delete model configuration "MiniMax-M2.7-highspeed(openai)"? This cannot be undone.')).toBeInTheDocument()
|
||||
|
||||
const dialog = screen.getByRole('dialog')
|
||||
await act(async () => {
|
||||
@@ -2201,12 +2201,31 @@ describe('Settings > Providers tab', () => {
|
||||
expect(MOCK_DELETE_PROVIDER).toHaveBeenCalledWith('provider-1')
|
||||
})
|
||||
|
||||
it.each([
|
||||
['zh', '模型配置', '模型管理', '添加模型', '配置名称'],
|
||||
['zh-TW', '模型設定', '模型管理', '新增模型', '設定名稱'],
|
||||
['en', 'Model Settings', 'Model Management', 'Add Model', 'Configuration name'],
|
||||
['jp', 'モデル設定', 'モデル管理', 'モデルを追加', '設定名'],
|
||||
['kr', '모델 설정', '모델 관리', '모델 추가', '설정 이름'],
|
||||
] as const)('uses model terminology throughout settings in %s', (locale, menu, title, add, name) => {
|
||||
useSettingsStore.setState({ locale })
|
||||
render(<Settings />)
|
||||
|
||||
expect(screen.getByRole('button', { name: new RegExp(menu) })).toBeInTheDocument()
|
||||
expect(screen.getByRole('heading', { name: title })).toBeInTheDocument()
|
||||
fireEvent.click(screen.getByRole('button', { name: new RegExp(add) }))
|
||||
|
||||
const dialog = screen.getByRole('dialog')
|
||||
expect(within(dialog).getByRole('heading', { name: add })).toBeInTheDocument()
|
||||
expect(within(dialog).getByLabelText(new RegExp(name))).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('keeps custom provider creation available when presets are unavailable', async () => {
|
||||
providerStoreState.presets = []
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
const addButton = screen.getByRole('button', { name: /Add Provider/i })
|
||||
const addButton = screen.getByRole('button', { name: /Add Model/i })
|
||||
expect(addButton).toBeEnabled()
|
||||
|
||||
fireEvent.click(addButton)
|
||||
@@ -2232,7 +2251,7 @@ describe('Settings > Providers tab', () => {
|
||||
providerStoreState.presets = [ZHIPU_REGIONAL_PRESET]
|
||||
|
||||
render(<Settings />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model/i }))
|
||||
|
||||
const dialog = screen.getByRole('dialog')
|
||||
await waitFor(() => expect(settleSettings).toBeTypeOf('function'))
|
||||
@@ -2266,7 +2285,7 @@ describe('Settings > Providers tab', () => {
|
||||
providerStoreState.presets = [ZHIPU_REGIONAL_PRESET]
|
||||
|
||||
render(<Settings />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model/i }))
|
||||
|
||||
const dialog = screen.getByRole('dialog')
|
||||
await waitFor(() => expect(resolveSettings).toBeTypeOf('function'))
|
||||
@@ -2317,7 +2336,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model/i }))
|
||||
|
||||
const dialog = screen.getByRole('dialog')
|
||||
expect(within(dialog).queryByRole('combobox')).not.toBeInTheDocument()
|
||||
@@ -2351,7 +2370,7 @@ describe('Settings > Providers tab', () => {
|
||||
}]
|
||||
|
||||
render(<Settings />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model/i }))
|
||||
|
||||
const dialog = screen.getByRole('dialog')
|
||||
const mediaSupport = within(dialog).getByLabelText('Preserve nested tool result media')
|
||||
@@ -2407,7 +2426,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /添加服务商/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /添加模型/i }))
|
||||
|
||||
const dialog = screen.getByRole('dialog')
|
||||
expect(within(dialog).getByPlaceholderText('例如: deepseek-v4-flash')).toBeInTheDocument()
|
||||
@@ -2449,7 +2468,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i }))
|
||||
const dialog = screen.getByRole('dialog')
|
||||
await waitFor(() => {
|
||||
const settingsTextarea = dialog.querySelector('textarea')
|
||||
@@ -2514,7 +2533,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i }))
|
||||
const dialog = screen.getByRole('dialog')
|
||||
const settingsTextarea = await waitFor(() => {
|
||||
const textarea = dialog.querySelector('textarea')
|
||||
@@ -2603,7 +2622,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i }))
|
||||
const dialog = screen.getByRole('dialog')
|
||||
await waitFor(() => {
|
||||
const settingsTextarea = dialog.querySelector('textarea')
|
||||
@@ -2685,7 +2704,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model/i }))
|
||||
const dialog = screen.getByRole('dialog')
|
||||
const toolSearchCheckbox = within(dialog).getByRole('checkbox', { name: 'Enable Tool Search' })
|
||||
|
||||
@@ -2763,7 +2782,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model/i }))
|
||||
const dialog = screen.getByRole('dialog')
|
||||
const disableBetasCheckbox = within(dialog).getByRole('checkbox', { name: 'Disable experimental beta headers' })
|
||||
expect(within(dialog).getByText(
|
||||
@@ -2840,7 +2859,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i }))
|
||||
const dialog = screen.getByRole('dialog')
|
||||
await waitFor(() => {
|
||||
const settingsTextarea = dialog.querySelector('textarea')
|
||||
@@ -2902,7 +2921,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model/i }))
|
||||
|
||||
const dialog = screen.getByRole('dialog')
|
||||
const apiKeyInput = within(dialog).getByPlaceholderText('sk-...')
|
||||
@@ -2940,7 +2959,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i }))
|
||||
const dialog = screen.getByRole('dialog')
|
||||
await waitFor(() => {
|
||||
expect(dialog.querySelector('textarea')?.value).toContain('"ANTHROPIC_MODEL"')
|
||||
@@ -2977,7 +2996,7 @@ describe('Settings > Providers tab', () => {
|
||||
|
||||
render(<Settings />)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider|添加服务商/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model|添加模型/i }))
|
||||
const dialog = screen.getByRole('dialog')
|
||||
const fetchButton = within(dialog).getByRole('button', { name: /Fetch models|获取模型/i })
|
||||
|
||||
|
||||
@@ -418,7 +418,7 @@ export const en = {
|
||||
|
||||
// ─── Settings ──────────────────────────────────────
|
||||
'settings.title': 'Settings',
|
||||
'settings.tab.providers': 'Providers',
|
||||
'settings.tab.providers': 'Model Settings',
|
||||
'settings.tab.permissions': 'Permissions',
|
||||
'settings.tab.activity': 'Token usage',
|
||||
'settings.tab.trace': 'Trace',
|
||||
@@ -821,9 +821,9 @@ Row 9, all 8 cells: continuing from straight down, turning left through lower-le
|
||||
'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth error: ',
|
||||
|
||||
// Settings > Providers
|
||||
'settings.providers.title': 'Providers',
|
||||
'settings.providers.description': 'Manage API providers for model access.',
|
||||
'settings.providers.addProvider': 'Add Provider',
|
||||
'settings.providers.title': 'Model Management',
|
||||
'settings.providers.description': 'Configure models, API endpoints, and credentials.',
|
||||
'settings.providers.addProvider': 'Add Model',
|
||||
'settings.providers.officialName': 'Claude Official',
|
||||
'settings.providers.officialDesc': 'Anthropic native — no API key required',
|
||||
'settings.providers.openaiOfficialName': 'ChatGPT Official',
|
||||
@@ -836,7 +836,7 @@ Row 9, all 8 cells: continuing from straight down, turning left through lower-le
|
||||
'settings.providers.connectivityFailed': '① Connectivity failed: {error}',
|
||||
'settings.providers.proxyOk': '② Proxy pipeline ({latency}ms)',
|
||||
'settings.providers.proxyFailed': '② Proxy failed: {error}',
|
||||
'settings.providers.confirmDelete': 'Delete provider "{name}"? This cannot be undone.',
|
||||
'settings.providers.confirmDelete': 'Delete model configuration "{name}"? This cannot be undone.',
|
||||
'settings.providers.activate': 'Activate',
|
||||
'settings.providers.default': 'Default',
|
||||
'settings.providers.setDefault': 'Set default',
|
||||
@@ -844,11 +844,11 @@ Row 9, all 8 cells: continuing from straight down, turning left through lower-le
|
||||
'settings.providers.edit': 'Edit',
|
||||
'settings.providers.dragToReorder': 'Drag to reorder',
|
||||
'settings.providers.requestFailed': 'Request failed',
|
||||
'settings.providers.addTitle': 'Add Provider',
|
||||
'settings.providers.editTitle': 'Edit Provider',
|
||||
'settings.providers.addTitle': 'Add Model',
|
||||
'settings.providers.editTitle': 'Edit Model',
|
||||
'settings.providers.preset': 'Preset',
|
||||
'settings.providers.name': 'Name',
|
||||
'settings.providers.namePlaceholder': 'Provider name',
|
||||
'settings.providers.name': 'Configuration name',
|
||||
'settings.providers.namePlaceholder': 'Configuration name',
|
||||
'settings.providers.notes': 'Notes',
|
||||
'settings.providers.notesPlaceholder': 'Optional notes...',
|
||||
'settings.providers.baseUrl': 'Base URL',
|
||||
|
||||
@@ -420,7 +420,7 @@ export const jp: Record<TranslationKey, string> = {
|
||||
|
||||
// ─── Settings ──────────────────────────────────────
|
||||
'settings.title': '設定',
|
||||
'settings.tab.providers': 'プロバイダー',
|
||||
'settings.tab.providers': 'モデル設定',
|
||||
'settings.tab.permissions': '権限',
|
||||
'settings.tab.activity': 'トークン使用量',
|
||||
'settings.tab.trace': 'Trace',
|
||||
@@ -823,9 +823,9 @@ export const jp: Record<TranslationKey, string> = {
|
||||
'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth エラー: ',
|
||||
|
||||
// Settings > Providers
|
||||
'settings.providers.title': 'プロバイダー',
|
||||
'settings.providers.description': 'モデルにアクセスするための API プロバイダーを管理します。',
|
||||
'settings.providers.addProvider': 'プロバイダーを追加',
|
||||
'settings.providers.title': 'モデル管理',
|
||||
'settings.providers.description': 'モデル、API エンドポイント、認証情報を設定します。',
|
||||
'settings.providers.addProvider': 'モデルを追加',
|
||||
'settings.providers.officialName': 'Claude 公式',
|
||||
'settings.providers.officialDesc': 'Anthropic ネイティブ — API キー不要',
|
||||
'settings.providers.openaiOfficialName': 'ChatGPT 公式',
|
||||
@@ -838,7 +838,7 @@ export const jp: Record<TranslationKey, string> = {
|
||||
'settings.providers.connectivityFailed': '① 接続に失敗しました: {error}',
|
||||
'settings.providers.proxyOk': '② プロキシパイプライン ({latency}ms)',
|
||||
'settings.providers.proxyFailed': '② プロキシ失敗: {error}',
|
||||
'settings.providers.confirmDelete': 'プロバイダー「{name}」を削除しますか?この操作は取り消せません。',
|
||||
'settings.providers.confirmDelete': 'モデル設定「{name}」を削除しますか?この操作は取り消せません。',
|
||||
'settings.providers.activate': '有効化',
|
||||
'settings.providers.default': 'デフォルト',
|
||||
'settings.providers.setDefault': 'デフォルトに設定',
|
||||
@@ -846,11 +846,11 @@ export const jp: Record<TranslationKey, string> = {
|
||||
'settings.providers.edit': '編集',
|
||||
'settings.providers.dragToReorder': 'ドラッグして並べ替え',
|
||||
'settings.providers.requestFailed': 'リクエストに失敗しました',
|
||||
'settings.providers.addTitle': 'プロバイダーを追加',
|
||||
'settings.providers.editTitle': 'プロバイダーを編集',
|
||||
'settings.providers.addTitle': 'モデルを追加',
|
||||
'settings.providers.editTitle': 'モデルを編集',
|
||||
'settings.providers.preset': 'プリセット',
|
||||
'settings.providers.name': '名前',
|
||||
'settings.providers.namePlaceholder': 'プロバイダー名',
|
||||
'settings.providers.name': '設定名',
|
||||
'settings.providers.namePlaceholder': '設定名',
|
||||
'settings.providers.notes': 'メモ',
|
||||
'settings.providers.notesPlaceholder': '任意のメモ...',
|
||||
'settings.providers.baseUrl': 'ベース URL',
|
||||
|
||||
@@ -420,7 +420,7 @@ export const kr: Record<TranslationKey, string> = {
|
||||
|
||||
// ─── Settings ──────────────────────────────────────
|
||||
'settings.title': '설정',
|
||||
'settings.tab.providers': '공급자',
|
||||
'settings.tab.providers': '모델 설정',
|
||||
'settings.tab.permissions': '권한',
|
||||
'settings.tab.activity': '토큰 사용량',
|
||||
'settings.tab.trace': 'Trace',
|
||||
@@ -823,9 +823,9 @@ export const kr: Record<TranslationKey, string> = {
|
||||
'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth 오류: ',
|
||||
|
||||
// Settings > Providers
|
||||
'settings.providers.title': '공급자',
|
||||
'settings.providers.description': '모델 액세스를 위한 API 공급자를 관리합니다.',
|
||||
'settings.providers.addProvider': '공급자 추가',
|
||||
'settings.providers.title': '모델 관리',
|
||||
'settings.providers.description': '모델, API 엔드포인트 및 인증 정보를 설정합니다.',
|
||||
'settings.providers.addProvider': '모델 추가',
|
||||
'settings.providers.officialName': 'Claude 공식',
|
||||
'settings.providers.officialDesc': 'Anthropic 네이티브 — API 키 불필요',
|
||||
'settings.providers.openaiOfficialName': 'ChatGPT 공식',
|
||||
@@ -838,7 +838,7 @@ export const kr: Record<TranslationKey, string> = {
|
||||
'settings.providers.connectivityFailed': '① 연결 실패: {error}',
|
||||
'settings.providers.proxyOk': '② 프록시 파이프라인 ({latency}ms)',
|
||||
'settings.providers.proxyFailed': '② 프록시 실패: {error}',
|
||||
'settings.providers.confirmDelete': '공급자 "{name}"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
|
||||
'settings.providers.confirmDelete': '모델 설정 "{name}"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.',
|
||||
'settings.providers.activate': '활성화',
|
||||
'settings.providers.default': '기본값',
|
||||
'settings.providers.setDefault': '기본값으로 설정',
|
||||
@@ -846,11 +846,11 @@ export const kr: Record<TranslationKey, string> = {
|
||||
'settings.providers.edit': '편집',
|
||||
'settings.providers.dragToReorder': '드래그하여 순서 변경',
|
||||
'settings.providers.requestFailed': '요청에 실패했습니다',
|
||||
'settings.providers.addTitle': '공급자 추가',
|
||||
'settings.providers.editTitle': '공급자 편집',
|
||||
'settings.providers.addTitle': '모델 추가',
|
||||
'settings.providers.editTitle': '모델 편집',
|
||||
'settings.providers.preset': '사전 설정',
|
||||
'settings.providers.name': '이름',
|
||||
'settings.providers.namePlaceholder': '공급자 이름',
|
||||
'settings.providers.name': '설정 이름',
|
||||
'settings.providers.namePlaceholder': '설정 이름',
|
||||
'settings.providers.notes': '메모',
|
||||
'settings.providers.notesPlaceholder': '선택 사항 메모...',
|
||||
'settings.providers.baseUrl': '기본 URL',
|
||||
|
||||
@@ -420,7 +420,7 @@ export const zh: Record<TranslationKey, string> = {
|
||||
|
||||
// ─── Settings ──────────────────────────────────────
|
||||
'settings.title': '設定',
|
||||
'settings.tab.providers': '服務商',
|
||||
'settings.tab.providers': '模型設定',
|
||||
'settings.tab.permissions': '許可權',
|
||||
'settings.tab.activity': 'Token 用量',
|
||||
'settings.tab.trace': 'Trace',
|
||||
@@ -822,9 +822,9 @@ export const zh: Record<TranslationKey, string> = {
|
||||
'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth 錯誤:',
|
||||
|
||||
// Settings > Providers
|
||||
'settings.providers.title': '服務商',
|
||||
'settings.providers.description': '管理 API 服務商以訪問模型。',
|
||||
'settings.providers.addProvider': '新增服務商',
|
||||
'settings.providers.title': '模型管理',
|
||||
'settings.providers.description': '設定模型、API 端點與存取憑證。',
|
||||
'settings.providers.addProvider': '新增模型',
|
||||
'settings.providers.officialName': 'Claude 官方',
|
||||
'settings.providers.officialDesc': 'Anthropic 原生接入 — 無需 API 金鑰',
|
||||
'settings.providers.openaiOfficialName': 'ChatGPT 官方',
|
||||
@@ -837,7 +837,7 @@ export const zh: Record<TranslationKey, string> = {
|
||||
'settings.providers.connectivityFailed': '① 連通失敗: {error}',
|
||||
'settings.providers.proxyOk': '② 代理轉換 ({latency}ms)',
|
||||
'settings.providers.proxyFailed': '② 代理轉換失敗: {error}',
|
||||
'settings.providers.confirmDelete': '刪除服務商 "{name}"?此操作不可撤銷。',
|
||||
'settings.providers.confirmDelete': '刪除模型設定 "{name}"?此操作無法復原。',
|
||||
'settings.providers.activate': '啟用',
|
||||
'settings.providers.default': '預設',
|
||||
'settings.providers.setDefault': '設為預設',
|
||||
@@ -845,11 +845,11 @@ export const zh: Record<TranslationKey, string> = {
|
||||
'settings.providers.edit': '編輯',
|
||||
'settings.providers.dragToReorder': '拖曳排序',
|
||||
'settings.providers.requestFailed': '請求失敗',
|
||||
'settings.providers.addTitle': '新增服務商',
|
||||
'settings.providers.editTitle': '編輯服務商',
|
||||
'settings.providers.addTitle': '新增模型',
|
||||
'settings.providers.editTitle': '編輯模型',
|
||||
'settings.providers.preset': '預設',
|
||||
'settings.providers.name': '名稱',
|
||||
'settings.providers.namePlaceholder': '服務商名稱',
|
||||
'settings.providers.name': '設定名稱',
|
||||
'settings.providers.namePlaceholder': '設定名稱',
|
||||
'settings.providers.notes': '備註',
|
||||
'settings.providers.notesPlaceholder': '可選備註...',
|
||||
'settings.providers.baseUrl': '介面地址',
|
||||
|
||||
@@ -420,7 +420,7 @@ export const zh: Record<TranslationKey, string> = {
|
||||
|
||||
// ─── Settings ──────────────────────────────────────
|
||||
'settings.title': '设置',
|
||||
'settings.tab.providers': '服务商',
|
||||
'settings.tab.providers': '模型配置',
|
||||
'settings.tab.permissions': '权限',
|
||||
'settings.tab.activity': 'Token 用量',
|
||||
'settings.tab.trace': 'Trace',
|
||||
@@ -822,9 +822,9 @@ export const zh: Record<TranslationKey, string> = {
|
||||
'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth 错误:',
|
||||
|
||||
// Settings > Providers
|
||||
'settings.providers.title': '服务商',
|
||||
'settings.providers.description': '管理 API 服务商以访问模型。',
|
||||
'settings.providers.addProvider': '添加服务商',
|
||||
'settings.providers.title': '模型管理',
|
||||
'settings.providers.description': '配置模型、API 接口与访问凭证。',
|
||||
'settings.providers.addProvider': '添加模型',
|
||||
'settings.providers.officialName': 'Claude 官方',
|
||||
'settings.providers.officialDesc': 'Anthropic 原生接入 — 无需 API 密钥',
|
||||
'settings.providers.openaiOfficialName': 'ChatGPT 官方',
|
||||
@@ -837,7 +837,7 @@ export const zh: Record<TranslationKey, string> = {
|
||||
'settings.providers.connectivityFailed': '① 连通失败: {error}',
|
||||
'settings.providers.proxyOk': '② 代理转换 ({latency}ms)',
|
||||
'settings.providers.proxyFailed': '② 代理转换失败: {error}',
|
||||
'settings.providers.confirmDelete': '删除服务商 "{name}"?此操作不可撤销。',
|
||||
'settings.providers.confirmDelete': '删除模型配置 "{name}"?此操作不可撤销。',
|
||||
'settings.providers.activate': '激活',
|
||||
'settings.providers.default': '默认',
|
||||
'settings.providers.setDefault': '设为默认',
|
||||
@@ -845,11 +845,11 @@ export const zh: Record<TranslationKey, string> = {
|
||||
'settings.providers.edit': '编辑',
|
||||
'settings.providers.dragToReorder': '拖动排序',
|
||||
'settings.providers.requestFailed': '请求失败',
|
||||
'settings.providers.addTitle': '添加服务商',
|
||||
'settings.providers.editTitle': '编辑服务商',
|
||||
'settings.providers.addTitle': '添加模型',
|
||||
'settings.providers.editTitle': '编辑模型',
|
||||
'settings.providers.preset': '预设',
|
||||
'settings.providers.name': '名称',
|
||||
'settings.providers.namePlaceholder': '服务商名称',
|
||||
'settings.providers.name': '配置名称',
|
||||
'settings.providers.namePlaceholder': '配置名称',
|
||||
'settings.providers.notes': '备注',
|
||||
'settings.providers.notesPlaceholder': '可选备注...',
|
||||
'settings.providers.baseUrl': '接口地址',
|
||||
|
||||
@@ -78,7 +78,7 @@ describe('Settings section navigation', () => {
|
||||
it('keeps the rail on paper so the Settings tab meets its own content', () => {
|
||||
render(<Settings />)
|
||||
|
||||
const rail = screen.getByRole('button', { name: 'Providers' })
|
||||
const rail = screen.getByRole('button', { name: 'Model Settings' })
|
||||
.closest('div[class*="w-[195px]"]')
|
||||
|
||||
// This rail is what sits directly under the Settings tab, and the tab is
|
||||
|
||||
@@ -46,7 +46,7 @@ describe('ApiSmart sponsor provider', () => {
|
||||
provider: { ...input, id: 'saved-apismart', apiFormat: input.apiFormat ?? 'anthropic' },
|
||||
}))
|
||||
render(<ProviderSettings />)
|
||||
fireEvent.click(await screen.findByRole('button', { name: /Add Provider/ }))
|
||||
fireEvent.click(await screen.findByRole('button', { name: /Add Model/ }))
|
||||
const dialog = within(screen.getByRole('dialog'))
|
||||
const sponsor = dialog.getByRole('button', { name: 'ApiSmart' })
|
||||
expect(sponsor.parentElement).toBe(dialog.getByRole('button', { name: 'Atlas Cloud' }).parentElement)
|
||||
@@ -83,7 +83,7 @@ describe('ApiSmart sponsor provider', () => {
|
||||
|
||||
it('resets image credentials and defaults when switching presets', async () => {
|
||||
render(<ProviderSettings />)
|
||||
fireEvent.click(await screen.findByRole('button', { name: /Add Provider/ }))
|
||||
fireEvent.click(await screen.findByRole('button', { name: /Add Model/ }))
|
||||
const dialog = within(screen.getByRole('dialog'))
|
||||
fireEvent.click(dialog.getByRole('button', { name: 'ApiSmart' }))
|
||||
fireEvent.change(dialog.getAllByPlaceholderText('sk-...')[1]!, { target: { value: 'fake-image-only-key' } })
|
||||
@@ -128,7 +128,7 @@ describe('retired sponsor providers', () => {
|
||||
}
|
||||
expect(useProviderStore.getState().providers).toEqual(savedProviders)
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Provider/ }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /Add Model/ }))
|
||||
const dialog = within(screen.getByRole('dialog'))
|
||||
for (const provider of savedProviders) {
|
||||
expect(dialog.queryByRole('button', { name: provider.name })).not.toBeInTheDocument()
|
||||
|
||||
Reference in New Issue
Block a user