{configured
diff --git a/src/renderer/components/__tests__/SettingsPanel.test.tsx b/src/renderer/components/__tests__/SettingsPanel.test.tsx
index f69b09b..2a9c2ff 100644
--- a/src/renderer/components/__tests__/SettingsPanel.test.tsx
+++ b/src/renderer/components/__tests__/SettingsPanel.test.tsx
@@ -12,6 +12,7 @@ const baseSettings: Settings = {
provider: 'deepseek',
model: 'deepseek-v4-flash',
language: 'en-US',
+ selectedCodeLanguage: 'Python',
}
function installElectronAPI(settings: Settings = baseSettings) {
@@ -70,6 +71,7 @@ describe('SettingsPanel', () => {
provider: 'kimi',
model: 'kimi-k2.5',
language: 'en-US',
+ selectedCodeLanguage: 'Rust',
})
expect(await screen.findByText('API Key configured')).toBeInTheDocument()
@@ -105,6 +107,7 @@ describe('SettingsPanel', () => {
provider: 'deepseek',
model: 'deepseek-v4-flash',
language: 'en-US',
+ selectedCodeLanguage: 'Python',
})
await screen.findByText('API Key configured')
@@ -120,13 +123,15 @@ describe('SettingsPanel', () => {
provider: 'unknown-provider' as Settings['provider'],
model: 'unknown-model',
language: 'en-US',
+ selectedCodeLanguage: 'TypeScript' as Settings['selectedCodeLanguage'],
})
await screen.findByText('API Key configured')
- const [providerSelect, modelSelect] = screen.getAllByRole('combobox')
+ const [providerSelect, modelSelect, codeLanguageSelect] = screen.getAllByRole('combobox')
expect(providerSelect).toHaveValue('deepseek')
expect(modelSelect).toHaveValue('deepseek-v4-flash')
+ expect(codeLanguageSelect).toHaveValue('Python')
})
it('uses the default provider when stored settings omit provider', async () => {
@@ -135,6 +140,7 @@ describe('SettingsPanel', () => {
provider: '' as Settings['provider'],
model: 'deepseek-v4-pro',
language: 'en-US',
+ selectedCodeLanguage: 'Python',
})
await screen.findByText('API Key configured')
@@ -149,8 +155,8 @@ describe('SettingsPanel', () => {
const api = installElectronAPI()
vi.mocked(api.getSettings)
.mockReset()
- .mockResolvedValueOnce({ apiKey: 'sk-deep', provider: 'deepseek', model: 'deepseek-v4-flash', language: 'en-US' })
- .mockResolvedValueOnce({ apiKey: '', provider: 'kimi', model: 'kimi-k2.6', language: 'en-US' })
+ .mockResolvedValueOnce({ apiKey: 'sk-deep', provider: 'deepseek', model: 'deepseek-v4-flash', language: 'en-US', selectedCodeLanguage: 'Python' })
+ .mockResolvedValueOnce({ apiKey: '', provider: 'kimi', model: 'kimi-k2.6', language: 'en-US', selectedCodeLanguage: 'Python' })
render(
{
provider: 'kimi',
model: 'kimi-k2.6',
language: 'en-US',
+ selectedCodeLanguage: 'Python',
})
await screen.findByText('API Key configured')
@@ -186,4 +193,24 @@ describe('SettingsPanel', () => {
expect(api.saveSettings).toHaveBeenCalledWith({ model: 'kimi-k2.5' })
expect(modelSelect).toHaveValue('kimi-k2.5')
})
+
+ it('shows and saves the selected output code language', async () => {
+ const user = userEvent.setup()
+ const { api } = renderSettingsPanel({
+ apiKey: 'sk-existing',
+ provider: 'deepseek',
+ model: 'deepseek-v4-flash',
+ language: 'en-US',
+ selectedCodeLanguage: 'Go',
+ })
+
+ expect(await screen.findByText('Output Code Language')).toBeInTheDocument()
+ const [, , codeLanguageSelect] = screen.getAllByRole('combobox')
+ expect(codeLanguageSelect).toHaveValue('Go')
+
+ await user.selectOptions(codeLanguageSelect, 'Rust')
+
+ expect(api.saveSettings).toHaveBeenCalledWith({ selectedCodeLanguage: 'Rust' })
+ expect(codeLanguageSelect).toHaveValue('Rust')
+ })
})
diff --git a/src/renderer/i18n.ts b/src/renderer/i18n.ts
index 86b9566..958fac9 100644
--- a/src/renderer/i18n.ts
+++ b/src/renderer/i18n.ts
@@ -8,6 +8,7 @@ const messages: Record>> = {
apiKeyConfigured: 'API Key 已配置',
apiKeyMissing: 'API Key 未配置',
model: '模型',
+ outputCodeLanguage: '输出代码语言',
apiKey: 'API Key',
provider: '模型供应商',
save: '保存',
@@ -84,6 +85,7 @@ const messages: Record>> = {
apiKeyConfigured: 'API Key configured',
apiKeyMissing: 'API Key missing',
model: 'Model',
+ outputCodeLanguage: 'Output Code Language',
apiKey: 'API Key',
provider: 'Provider',
save: 'Save',
diff --git a/src/renderer/types.d.ts b/src/renderer/types.d.ts
index 3b40fbd..f611cae 100644
--- a/src/renderer/types.d.ts
+++ b/src/renderer/types.d.ts
@@ -1,5 +1,6 @@
type Language = 'zh-CN' | 'en-US'
type AnalysisStatus = 'idle' | 'parsing' | 'analyzing' | 'success' | 'error'
+type CodeLanguage = 'Python' | 'C' | 'C++' | 'Java' | 'Go' | 'Rust' | 'MATLAB' | 'R'
interface TokenUsage {
promptTokens?: number
@@ -26,8 +27,8 @@ interface AnalysisError {
interface ElectronAPI {
selectPDF: () => Promise
- saveSettings: (settings: { apiKey?: string; provider?: string; model?: string; language?: Language }) => Promise
- getSettings: () => Promise<{ apiKey: string; provider: string; model: string; language: Language }>
+ saveSettings: (settings: { apiKey?: string; provider?: string; model?: string; language?: Language; selectedCodeLanguage?: CodeLanguage }) => Promise
+ getSettings: () => Promise<{ apiKey: string; provider: string; model: string; language: Language; selectedCodeLanguage: CodeLanguage }>
analyzePaper: (pdfPath: string) => Promise
cancelAnalysis: () => Promise
downloadCoreCode: () => Promise<{ ok: true; path: string } | { ok: false; error: string }>