diff --git a/src/SettingsTab.ts b/src/SettingsTab.ts index bff19fd..1e19744 100644 --- a/src/SettingsTab.ts +++ b/src/SettingsTab.ts @@ -168,12 +168,12 @@ export class GPTSettingsTab extends PluginSettingTab { const knownModels = new Set(); new Setting(el) - .setName("Model") + .setName(t("settings_model_heading")) .setHeading(); new Setting(el) - .setName("Provider") - .setDesc("Select the active AI provider.") + .setName(t("settings_provider_name")) + .setDesc(t("settings_provider_desc")) .addDropdown(d => d .addOption("openai", "OpenAI") .addOption("anthropic", "Anthropic") @@ -188,8 +188,8 @@ export class GPTSettingsTab extends PluginSettingTab { ); new Setting(el) - .setName("Active model") - .setDesc("Provider is detected automatically from the model name.") + .setName(t("settings_active_model_name")) + .setDesc(t("settings_active_model_desc")) .addDropdown(d => { const addModel = (id: string, label: string): void => { knownModels.add(id); @@ -213,7 +213,7 @@ export class GPTSettingsTab extends PluginSettingTab { d.addOption("__local_header__", "--- Local API ---"); for (const model of localModels) addModel(model, model); if (localModels.length === 0) { - d.addOption("__local_empty__", "(no models - click Refresh)"); + d.addOption("__local_empty__", t("settings_local_empty_paren")); } if (currentModel && !knownModels.has(currentModel)) addModel(currentModel, currentModel); @@ -243,8 +243,8 @@ export class GPTSettingsTab extends PluginSettingTab { }); new Setting(el) - .setName("Auto-detect provider") - .setDesc("Automatically detect AI provider from model name: claude-* -> Anthropic, gpt-* -> OpenAI, others -> Local API.") + .setName(t("settings_autodetect_name")) + .setDesc(t("settings_autodetect_desc")) .addToggle(toggle => toggle .setValue(this.plugin.settings.autoDetectProvider) .onChange(async (value: boolean) => { @@ -279,7 +279,7 @@ export class GPTSettingsTab extends PluginSettingTab { if (provider === "openai") { new Setting(el) - .setName("OpenAI API Key") + .setName(t("settings_openai_key_name")) .setDesc(keysLocation) .addText(txt => { txt.inputEl.type = "password"; @@ -292,7 +292,7 @@ export class GPTSettingsTab extends PluginSettingTab { }); } else if (provider === "anthropic") { new Setting(el) - .setName("Anthropic API Key") + .setName(t("settings_claude_key_name")) .setDesc(keysLocation) .addText(txt => { txt.inputEl.type = "password"; @@ -314,12 +314,12 @@ export class GPTSettingsTab extends PluginSettingTab { const localModels = this.getLocalModelOptions(); new Setting(el) - .setName("Local API") - .setDesc("Use local models through LM Studio, Ollama or other local servers.") + .setName(t("settings_local_title")) + .setDesc(t("settings_local_desc")) .setHeading(); new Setting(el) - .setName("Local API Type") + .setName(t("settings_local_type_name")) .addDropdown(d => d .addOption("openai-compatible", "OpenAI-compatible") .addOption("ollama", "Ollama") @@ -341,8 +341,8 @@ export class GPTSettingsTab extends PluginSettingTab { ); new Setting(el) - .setName("Base URL") - .setDesc("LM Studio usually uses http://localhost:1234/v1. Ollama usually uses http://localhost:11434.") + .setName(t("settings_local_baseurl_name")) + .setDesc(t("settings_local_baseurl_desc")) .addText(txt => { txt.setPlaceholder(placeholder) .setValue(this.plugin.settings.localBaseUrl ?? "") @@ -354,33 +354,33 @@ export class GPTSettingsTab extends PluginSettingTab { }); new Setting(el) - .setName("Refresh models") - .setDesc("Fetch available models from your selected local server.") + .setName(t("settings_local_refresh_name")) + .setDesc(t("settings_local_refresh_desc")) .addButton(btn => btn - .setButtonText("Refresh models") - .setTooltip("Fetch available models from your local server") + .setButtonText(t("settings_local_refresh_btn")) + .setTooltip(t("settings_local_refresh_tip")) .onClick(() => { - btn.setButtonText("Refreshing...").setDisabled(true); + btn.setButtonText(t("settings_local_refreshing")).setDisabled(true); void this.refreshLocalModelsInSelector() .catch((err: unknown) => { const message = err instanceof Error ? err.message : String(err); console.error("Local API refresh failed:", err); - new Notice(`Local API refresh failed: ${message}`, 7000); + new Notice(t("settings_local_refresh_fail", message), 7000); }) .finally(() => { - btn.setButtonText("Refresh models").setDisabled(false); + btn.setButtonText(t("settings_local_refresh_btn")).setDisabled(false); }); }), ); new Setting(el) - .setName("Model") + .setName(t("settings_local_model_name")) .setDesc(localModels.length > 0 - ? "Select the local model used for chat." - : "Click Refresh models after starting your local server.") + ? t("settings_local_model_desc_ok") + : t("settings_local_model_desc_empty")) .addDropdown(d => { if (localModels.length === 0) { - d.addOption("__local_empty__", "No models loaded"); + d.addOption("__local_empty__", t("settings_local_model_empty_opt")); d.setValue("__local_empty__"); return d; } @@ -417,7 +417,7 @@ export class GPTSettingsTab extends PluginSettingTab { } await this.plugin.saveSettings(); - new Notice(`Found ${models.length} Local API model(s)`, 3000); + new Notice(t("settings_local_models_found", models.length), 3000); this.display(); } diff --git a/src/i18n.ts b/src/i18n.ts index 96b51f9..8970dbf 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -69,6 +69,34 @@ const en: TranslationDict = { settings_lang_name: "Language", settings_lang_desc: "Interface language for the plugin.", + // Model selector + settings_model_heading: "Model", + settings_provider_name: "Provider", + settings_provider_desc: "Select the active AI provider.", + settings_active_model_name: "Active model", + settings_active_model_desc: "Provider is detected automatically from the model name.", + settings_local_empty_paren: "(no models - click Refresh)", + settings_autodetect_name: "Auto-detect provider", + settings_autodetect_desc: "Automatically detect AI provider from model name: claude-* -> Anthropic, gpt-* -> OpenAI, others -> Local API.", + + // Local API + settings_local_title: "🖥️ Local API", + settings_local_desc: "Use local models through LM Studio, Ollama or other local servers.", + settings_local_type_name: "Local API Type", + settings_local_baseurl_name: "Base URL", + settings_local_baseurl_desc: "LM Studio usually uses http://localhost:1234/v1. Ollama usually uses http://localhost:11434.", + settings_local_refresh_name: "Refresh models", + settings_local_refresh_desc: "Fetch available models from your selected local server.", + settings_local_refresh_btn: "Refresh models", + settings_local_refresh_tip: "Fetch available models from your local server", + settings_local_refreshing: "Refreshing...", + settings_local_refresh_fail: (m: string) => `Local API refresh failed: ${m}`, + settings_local_model_name: "Model", + settings_local_model_desc_ok: "Select the local model used for chat.", + settings_local_model_desc_empty: "Click Refresh models after starting your local server.", + settings_local_model_empty_opt: "No models loaded", + settings_local_models_found: (n: number) => `Found ${n} Local API model(s)`, + // Chat view chat_new: "New", chat_history: "History", @@ -358,6 +386,34 @@ const pl: TranslationDict = { settings_lang_name: "Język / Language", settings_lang_desc: "Język interfejsu wtyczki.", + // Model selector + settings_model_heading: "Model", + settings_provider_name: "Dostawca", + settings_provider_desc: "Wybierz aktywnego dostawcę AI.", + settings_active_model_name: "Aktywny model", + settings_active_model_desc: "Dostawca jest wykrywany automatycznie na podstawie nazwy modelu.", + settings_local_empty_paren: "(brak modeli — kliknij Odśwież)", + settings_autodetect_name: "Auto-wykrywanie dostawcy", + settings_autodetect_desc: "Automatycznie wykrywaj dostawcę AI z nazwy modelu: claude-* → Anthropic, gpt-* → OpenAI, pozostałe → Lokalne API.", + + // Local API + settings_local_title: "🖥️ Lokalne API", + settings_local_desc: "Używaj lokalnych modeli przez LM Studio, Ollama lub inne lokalne serwery.", + settings_local_type_name: "Typ lokalnego API", + settings_local_baseurl_name: "Base URL", + settings_local_baseurl_desc: "LM Studio zwykle używa http://localhost:1234/v1. Ollama zwykle używa http://localhost:11434.", + settings_local_refresh_name: "Odśwież modele", + settings_local_refresh_desc: "Pobierz dostępne modele z wybranego lokalnego serwera.", + settings_local_refresh_btn: "Odśwież modele", + settings_local_refresh_tip: "Pobierz dostępne modele z lokalnego serwera", + settings_local_refreshing: "Odświeżanie…", + settings_local_refresh_fail: (m: string) => `Odświeżanie lokalnego API nie powiodło się: ${m}`, + settings_local_model_name: "Model", + settings_local_model_desc_ok: "Wybierz lokalny model używany do czatu.", + settings_local_model_desc_empty: "Kliknij Odśwież modele po uruchomieniu lokalnego serwera.", + settings_local_model_empty_opt: "Brak załadowanych modeli", + settings_local_models_found: (n: number) => `Znaleziono ${n} modeli lokalnego API`, + // Chat view chat_new: "Nowa", chat_history: "Historia",