diff --git a/manifest.json b/manifest.json
index 4684879..ace28de 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,7 +1,7 @@
{
"id": "ai-vault",
"name": "AI-Vault",
- "version": "1.0.2",
+ "version": "1.0.8",
"minAppVersion": "1.7.2",
"description": "Chat with GPT and Claude directly inside your notes — RAG from your vault, history, projects and smart modes.",
"author": "JamJan05",
diff --git a/package.json b/package.json
index 8db5700..b14f52b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ai-vault",
- "version": "1.0.2",
+ "version": "1.0.8",
"description": "AI-Vault — chat with GPT & Claude inside Obsidian, powered by your vault",
"main": "main.js",
"scripts": {
diff --git a/src/SettingsTab.ts b/src/SettingsTab.ts
index 1e19744..5a798b8 100644
--- a/src/SettingsTab.ts
+++ b/src/SettingsTab.ts
@@ -609,10 +609,10 @@ export class GPTSettingsTab extends PluginSettingTab {
info.empty();
info.createEl("strong", { text: t("settings_storage_active") });
info.createEl("br");
- info.appendChild(info.ownerDocument.createTextNode("Obsidian Sync does not sync this data."));
+ info.appendChild(info.ownerDocument.createTextNode(t("settings_storage_no_sync")));
info.createEl("br");
info.createEl("br");
- info.createEl("strong", { text: "Location:" });
+ info.createEl("strong", { text: t("settings_storage_location") });
info.createEl("br");
const pathEl = info.createEl("code", { text: currentPath });
pathEl.addClass("gpt-settings-storage-path");
@@ -641,7 +641,7 @@ export class GPTSettingsTab extends PluginSettingTab {
.setName(t("settings_storage_path_name"))
.setDesc(t("settings_storage_path_desc", defaultPath))
.addText(txt => {
- txt.setPlaceholder("/path/to/folder (empty = auto)")
+ txt.setPlaceholder(t("settings_storage_path_placeholder"))
.setValue(this.plugin.settings.externalStoragePath ?? "")
.setDisabled(!isDesktop);
txt.inputEl.addClass("gpt-settings-input-full");
diff --git a/src/history/HistoryManager.ts b/src/history/HistoryManager.ts
index 9edd9f5..86c8c79 100644
--- a/src/history/HistoryManager.ts
+++ b/src/history/HistoryManager.ts
@@ -1,4 +1,5 @@
import { DIR_HISTORY, FILE_HISTORY_INDEX } from "../constants";
+import { t } from "../i18n";
import type { ExternalStorage } from "../storage/ExternalStorage";
import type { ChatMessage, ChatSession, SessionMeta } from "../types";
@@ -88,7 +89,7 @@ export class HistoryManager {
const now = Date.now();
return {
id: now.toString(),
- title: "New conversation",
+ title: t("chat_default_title"),
createdAt: now,
updatedAt: now,
messages: [],
diff --git a/src/i18n.ts b/src/i18n.ts
index 8970dbf..6a2021d 100644
--- a/src/i18n.ts
+++ b/src/i18n.ts
@@ -58,6 +58,9 @@ const en: TranslationDict = {
settings_storage_open_name: "Open folder in explorer",
settings_storage_open_btn: "Open folder",
settings_storage_open_desc: "Shows the history folder in the system file manager.",
+ settings_storage_no_sync: "Obsidian Sync does not sync this data.",
+ settings_storage_location: "Location:",
+ settings_storage_path_placeholder: "/path/to/folder (empty = auto)",
settings_storage_active: "✅ Active — history saved OUTSIDE vault",
settings_storage_inactive: "⚠️ Disabled — history saved inside vault",
settings_storage_inactive_html: "⚠️ Disabled — history saved inside vault
Obsidian Sync may synchronize chat history (uses up your GB limit).",
@@ -120,6 +123,9 @@ const en: TranslationDict = {
chat_copy: "Copy",
chat_copied: "Copied!",
chat_interrupted: "⏹ Interrupted by user",
+ chat_generation_stopped: "⏹ Generation stopped",
+ chat_role_you: "You",
+ chat_default_title: "New conversation",
chat_btn_rag: "RAG",
chat_btn_index: "Index",
chat_btn_notes: "Notes",
@@ -215,6 +221,9 @@ const en: TranslationDict = {
projects_prompt_hint: "If set, this prompt REPLACES the global system prompt. Leave empty to use the global prompt.",
projects_create_btn: "Create",
projects_custom_prompt_badge:"· ✏️ custom prompt",
+ projects_modal_new_title: "New project:",
+ projects_modal_edit_title: (name: string) => `Edit project: ${name}`,
+ projects_name_placeholder: "Project name…",
// RAG
rag_ready_short: (f: number, e: number) => `🗄️ RAG ready — ${f} notes (${e} embeddings)`,
@@ -295,6 +304,12 @@ const en: TranslationDict = {
cmd_open_history: "Open chat history",
cmd_open_projects: "Open projects",
cmd_summarize: "Summarize current note",
+ cmd_new_chat: "New conversation",
+ cmd_analyze: "Analyze selected text",
+ cmd_reindex: "Re-index vault (RAG)",
+ cmd_select_text_first: "Select text first.",
+ cmd_note_empty: "Note is empty.",
+ cmd_indexing: "⏳ Indexing…",
// Quiz
quiz_error: "Error!",
@@ -375,6 +390,9 @@ const pl: TranslationDict = {
settings_storage_open_name: "Otwórz folder w eksploratorze",
settings_storage_open_btn: "Otwórz folder",
settings_storage_open_desc: "Pokazuje folder z historią w systemowym menedżerze plików.",
+ settings_storage_no_sync: "Obsidian Sync nie synchronizuje tych danych.",
+ settings_storage_location: "Lokalizacja:",
+ settings_storage_path_placeholder: "/ścieżka/do/folderu (puste = auto)",
settings_storage_active: "✅ Aktywny — historia zapisywana POZA vaultem",
settings_storage_inactive: "⚠️ Wyłączony — historia zapisywana w vaulcie",
settings_storage_inactive_html: "⚠️ Wyłączony — historia zapisywana w vaulcie
Obsidian Sync może synchronizować historię rozmów (zjada limit GB).",
@@ -437,6 +455,9 @@ const pl: TranslationDict = {
chat_copy: "Kopiuj",
chat_copied: "Skopiowano!",
chat_interrupted: "⏹ Przerwane przez użytkownika",
+ chat_generation_stopped: "⏹ Przerwano generowanie",
+ chat_role_you: "Ty",
+ chat_default_title: "Nowa rozmowa",
chat_btn_rag: "RAG",
chat_btn_index: "Indeksuj",
chat_btn_notes: "Notatki",
@@ -532,6 +553,9 @@ const pl: TranslationDict = {
projects_prompt_hint: "Gdy ustawisz ten prompt, ZASTĄPI on globalny prompt systemowy. Jeśli zostawisz puste — użyty będzie domyślny prompt.",
projects_create_btn: "Utwórz",
projects_custom_prompt_badge:"· ✏️ własny prompt",
+ projects_modal_new_title: "Nowy projekt:",
+ projects_modal_edit_title: (name: string) => `Edytuj projekt: ${name}`,
+ projects_name_placeholder: "Nazwa projektu…",
// RAG
rag_ready_short: (f: number, e: number) => `🗄️ RAG gotowy — ${f} notatek (${e} embeddingów)`,
@@ -612,6 +636,12 @@ const pl: TranslationDict = {
cmd_open_history: "Otwórz historię rozmów",
cmd_open_projects: "Otwórz projekty",
cmd_summarize: "Podsumuj aktualną notatkę",
+ cmd_new_chat: "Nowa rozmowa",
+ cmd_analyze: "Analizuj zaznaczony tekst",
+ cmd_reindex: "Przeindeksuj vault (RAG)",
+ cmd_select_text_first: "Najpierw zaznacz tekst.",
+ cmd_note_empty: "Notatka jest pusta.",
+ cmd_indexing: "⏳ Indeksowanie…",
// Quiz
quiz_error: "Błąd!",
diff --git a/src/main.ts b/src/main.ts
index e763ee9..c61a767 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -82,14 +82,14 @@ export default class GPTPlugin extends Plugin {
this.addCommand({ id: "open-gpt-chat", name: t("cmd_open_chat"), callback: () => void this.activateChatView() });
this.addCommand({ id: "open-gpt-history", name: t("cmd_open_history"), callback: () => void this.activateHistoryView() });
this.addCommand({ id: "open-gpt-projects", name: t("cmd_open_projects"),callback: () => void this.activateProjectsView() });
- this.addCommand({ id: "new-gpt-chat", name: "New conversation", callback: () => this.newChat() });
+ this.addCommand({ id: "new-gpt-chat", name: t("cmd_new_chat"), callback: () => this.newChat() });
this.addCommand({
id: "analyze-selection",
- name: "Analyze selected text",
+ name: t("cmd_analyze"),
editorCallback: async editor => {
const sel = editor.getSelection();
- if (!sel) { new Notice("Select text first."); return; }
+ if (!sel) { new Notice(t("cmd_select_text_first")); return; }
const view = await this.activateChatView();
await new Promise(r => window.setTimeout(r, 300));
void view?.sendMessage(`Analyze:\n\n${sel}`);
@@ -101,7 +101,7 @@ export default class GPTPlugin extends Plugin {
name: t("cmd_summarize"),
editorCallback: async editor => {
const c = editor.getValue();
- if (!c.trim()) { new Notice("Note is empty."); return; }
+ if (!c.trim()) { new Notice(t("cmd_note_empty")); return; }
const view = await this.activateChatView();
await new Promise(r => window.setTimeout(r, 300));
void view?.sendMessage(`Summarize in 5 points:\n\n${c.slice(0, 8000)}`);
@@ -110,12 +110,12 @@ export default class GPTPlugin extends Plugin {
this.addCommand({
id: "reindex-vault",
- name: "Re-index vault (RAG)",
+ name: t("cmd_reindex"),
callback: async () => {
- new Notice("⏳ Indexing…");
+ new Notice(t("cmd_indexing"));
await this.rag.buildIndex();
const s = this.rag.stats;
- new Notice(`✅ RAG: ${s.files} notes`);
+ new Notice(t("rag_done", s.files));
},
});
diff --git a/src/views/ChatView.ts b/src/views/ChatView.ts
index 219f03e..c5fed27 100644
--- a/src/views/ChatView.ts
+++ b/src/views/ChatView.ts
@@ -1172,9 +1172,9 @@ export class GPTChatView extends ItemView {
// Footer with copy button
const footer = msgEl.createEl("div", { cls: "gpt-msg-footer" });
const assistLabel = this.getProviderLabel(this.getEffectiveProvider());
- footer.createEl("span", { cls: "gpt-msg-label", text: role === "user" ? "You" : assistLabel });
+ footer.createEl("span", { cls: "gpt-msg-label", text: role === "user" ? t("chat_role_you") : assistLabel });
- const copyBtn = footer.createEl("button", { cls: "gpt-copy-btn", attr: { title: "Copy", "aria-label": "Copy" } });
+ const copyBtn = footer.createEl("button", { cls: "gpt-copy-btn", attr: { title: t("chat_copy"), "aria-label": t("chat_copy") } });
this.setButtonIcon(copyBtn, "copy");
copyBtn.onclick = async () => {
await navigator.clipboard.writeText(bubble.dataset.raw ?? contentEl.innerText);
@@ -1209,11 +1209,11 @@ export class GPTChatView extends ItemView {
if (this.stopBtn) return;
this.stopBtn = this.sendBtn.parentElement!.createEl("button", {
cls: "gpt-stop-btn",
- text: "⏹ Stop",
+ text: `⏹ ${t("chat_stop")}`,
});
this.stopBtn.onclick = () => {
this.abortController?.abort();
- new Notice("⏹ Generation stopped");
+ new Notice(t("chat_generation_stopped"));
};
this.sendBtn.addClass("gpt-ctx-hidden");
} else {
diff --git a/src/views/ProjectsView.ts b/src/views/ProjectsView.ts
index dd8a4ea..92f72fa 100644
--- a/src/views/ProjectsView.ts
+++ b/src/views/ProjectsView.ts
@@ -252,12 +252,12 @@ export class GPTProjectsView extends ItemView {
box.createEl("p", {
cls: "gpt-modal-title",
- text: isEdit ? `Edytuj projekt: ${editProject!.name}` : "Nowy projekt:",
+ text: isEdit ? t("projects_modal_edit_title", editProject!.name) : t("projects_modal_new_title"),
});
const nameInput = box.createEl("input", {
cls: "gpt-modal-input",
- attr: { type: "text", placeholder: "Nazwa projektu…" },
+ attr: { type: "text", placeholder: t("projects_name_placeholder") },
}) as HTMLInputElement;
if (isEdit) nameInput.value = editProject!.name;
diff --git a/versions.json b/versions.json
index 84bdfe3..ed80ac0 100644
--- a/versions.json
+++ b/versions.json
@@ -1,4 +1,5 @@
{
"1.0.0": "1.4.0",
- "1.0.2": "1.7.2"
+ "1.0.2": "1.7.2",
+ "1.0.8": "1.7.2"
}