From c5c2ee8a016ff18eb360a669fa7f5bad918ddfb6 Mon Sep 17 00:00:00 2001 From: JamJan05 Date: Wed, 3 Jun 2026 11:40:45 +0200 Subject: [PATCH] 1.0.7 Translate Local API / Ollama settings section to Polish. The Local API provider UI (added in 1.0.6) and the model selector used hardcoded English strings that bypassed the i18n t() system, so they showed in English even with the plugin set to Polish. - Add ~25 i18n keys (EN + PL) for the Local API section (API type, Base URL, refresh models, model list, notices) and the model selector (Provider, Active model, Auto-detect provider). - Route SettingsTab.ts through t() for those sections. - Localize the OpenAI/Anthropic API key labels via existing keys. - Keep the Language switcher bilingual by design. Co-Authored-By: Claude Opus 4.8 --- src/SettingsTab.ts | 54 ++++++++++++++++++++++---------------------- src/i18n.ts | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 27 deletions(-) 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",