From 5304ed3a4803ba2b2bf762b265c219a5734158a5 Mon Sep 17 00:00:00 2001 From: wujunchen Date: Wed, 29 Apr 2026 13:54:53 +0800 Subject: [PATCH] fix: localize remaining action labels Change-Id: I4ac6db14c4aede9a106e8023effac3c99d3c037a --- main.ts | 8 +++++++- src/i18n-strings.ts | 6 ++++++ src/modal.ts | 12 +++++++++--- src/settings-tab.ts | 2 +- tests/i18n.test.js | 2 ++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/main.ts b/main.ts index 994f6ac..cb335ef 100644 --- a/main.ts +++ b/main.ts @@ -328,7 +328,13 @@ class ParallelReaderPlugin extends Plugin { } confirmRegenerateEditedCards(): Promise { - return confirmRegenerateEditedCards(this.app, this.t('displayName'), this.t('confirmRegenerateEditedCards')); + return confirmRegenerateEditedCards( + this.app, + this.t('displayName'), + this.t('confirmRegenerateEditedCards'), + this.t('confirmRegenerateCancel'), + this.t('confirmRegenerateProceed'), + ); } addFileMenuItems(menu: ObsidianMenu, file: unknown) { diff --git a/src/i18n-strings.ts b/src/i18n-strings.ts index 4964fd9..314f382 100644 --- a/src/i18n-strings.ts +++ b/src/i18n-strings.ts @@ -60,6 +60,8 @@ export const STRINGS: Record> = { noActiveCard: '当前没有可跳转的摘要卡片', viewOpenFailed: '无法打开对照笔记面板', confirmRegenerateEditedCards: '这篇笔记的对照卡片已被手动编辑。重新生成会覆盖这些修改,是否继续?', + confirmRegenerateCancel: '取消', + confirmRegenerateProceed: '重新生成', regenerateCancelled: '已取消重新生成', cardDeleted: '已删除此卡片', cardSaved: '已保存此卡片', @@ -132,6 +134,7 @@ export const STRINGS: Record> = { settingCustomPromptDesc: '可选。支持变量:{minCards}、{maxCards}、{languageInstruction}、{schema}、{example}', settingCustomPromptPlaceholder: '留空使用内置 prompt', settingTestBackendName: '测试当前后端', + settingTestBackendButton: '测试', settingTestBackendDescApi: '会发起一次最小 LLM 请求验证 API 设置', settingTestBackendDescCli: '调用 ` --version` 验证 spawn 能找到二进制', backendTestFailed: '✗ 后端测试失败:{error}', @@ -221,6 +224,8 @@ export const STRINGS: Record> = { viewOpenFailed: 'Could not open the Parallel Reader pane', confirmRegenerateEditedCards: 'These parallel-reader cards were edited manually. Regenerating will overwrite those edits. Continue?', + confirmRegenerateCancel: 'Cancel', + confirmRegenerateProceed: 'Regenerate', regenerateCancelled: 'Regeneration cancelled', cardDeleted: 'Deleted this card', cardSaved: 'Saved this card', @@ -296,6 +301,7 @@ export const STRINGS: Record> = { settingCustomPromptDesc: 'Optional. Variables: {minCards}, {maxCards}, {languageInstruction}, {schema}, {example}', settingCustomPromptPlaceholder: 'Leave blank to use built-in prompt', settingTestBackendName: 'Test current backend', + settingTestBackendButton: 'Test', settingTestBackendDescApi: 'Sends a minimal LLM request to validate API settings.', settingTestBackendDescCli: 'Runs ` --version` to verify the binary can be spawned.', backendTestFailed: '✗ Backend test failed: {error}', diff --git a/src/modal.ts b/src/modal.ts index 292ee50..11009d7 100644 --- a/src/modal.ts +++ b/src/modal.ts @@ -4,7 +4,13 @@ import { type App, Modal } from 'obsidian'; import type { CardPatch, PluginHost, ResolvedCard } from './types'; import { addTextButton } from './ui-helpers'; -export function confirmRegenerateEditedCards(app: App, title: string, message: string): Promise { +export function confirmRegenerateEditedCards( + app: App, + title: string, + message: string, + cancelText: string, + confirmText: string, +): Promise { return new Promise((resolve) => { let settled = false; const settle = (value: boolean) => { @@ -16,11 +22,11 @@ export function confirmRegenerateEditedCards(app: App, title: string, message: s modal.titleEl.setText(title); modal.contentEl.createEl('p', { text: message }); const btnRow = modal.contentEl.createDiv({ cls: 'modal-button-container' }); - btnRow.createEl('button', { text: 'Cancel' }).addEventListener('click', () => { + btnRow.createEl('button', { text: cancelText }).addEventListener('click', () => { modal.close(); settle(false); }); - btnRow.createEl('button', { text: 'OK', cls: 'mod-cta' }).addEventListener('click', () => { + btnRow.createEl('button', { text: confirmText, cls: 'mod-cta' }).addEventListener('click', () => { modal.close(); settle(true); }); diff --git a/src/settings-tab.ts b/src/settings-tab.ts index 0c7b408..8d6d23d 100644 --- a/src/settings-tab.ts +++ b/src/settings-tab.ts @@ -342,7 +342,7 @@ export class ParallelReaderSettingTab extends PluginSettingTab { .setName(this.tr('settingTestBackendName')) .setDesc(isCliBacked ? this.tr('settingTestBackendDescCli') : this.tr('settingTestBackendDescApi')) .addButton((b) => - b.setButtonText('Test').onClick(async () => { + b.setButtonText(this.tr('settingTestBackendButton')).onClick(async () => { try { const result = await testBackend(this.plugin.settings); new Notice(`✓ ${result.slice(0, 180)}`, 8000); diff --git a/tests/i18n.test.js b/tests/i18n.test.js index 267ac29..42f0b48 100644 --- a/tests/i18n.test.js +++ b/tests/i18n.test.js @@ -25,5 +25,7 @@ assert.strictEqual( ); assert.strictEqual(t.translate({ uiLanguage: 'zh' }, 'appTitle'), '对照阅读笔记', 'zh translation for appTitle'); assert.strictEqual(t.translate({ uiLanguage: 'en' }, '__no_such_key__'), '__no_such_key__', 'missing key returns key'); +assert.strictEqual(t.translate({ uiLanguage: 'zh' }, 'settingTestBackendButton'), '测试'); +assert.strictEqual(t.translate({ uiLanguage: 'en' }, 'confirmRegenerateProceed'), 'Regenerate'); console.log('i18n tests passed');