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 <noreply@anthropic.com>
This commit is contained in:
JamJan05 2026-06-03 11:40:45 +02:00
parent c84ceb9edf
commit c5c2ee8a01
2 changed files with 83 additions and 27 deletions

View file

@ -168,12 +168,12 @@ export class GPTSettingsTab extends PluginSettingTab {
const knownModels = new Set<string>();
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();
}

View file

@ -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",