feat(dev): remove ai/llm features (#8678)
@@ -101,8 +101,6 @@ export type CommandMappings = {
|
||||
showRevisions: CommandData & {
|
||||
noteId?: string | null;
|
||||
};
|
||||
showLlmChat: CommandData;
|
||||
createAiChat: CommandData;
|
||||
showOptions: CommandData & {
|
||||
section: string;
|
||||
};
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
import dateNoteService from "../services/date_notes.js";
|
||||
import froca from "../services/froca.js";
|
||||
import noteCreateService from "../services/note_create.js";
|
||||
import openService from "../services/open.js";
|
||||
import options from "../services/options.js";
|
||||
import protectedSessionService from "../services/protected_session.js";
|
||||
import toastService from "../services/toast.js";
|
||||
import treeService from "../services/tree.js";
|
||||
import utils, { openInReusableSplit } from "../services/utils.js";
|
||||
import appContext, { type CommandListenerData } from "./app_context.js";
|
||||
@@ -248,34 +246,4 @@ export default class RootCommandExecutor extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
async createAiChatCommand() {
|
||||
try {
|
||||
// Create a new AI Chat note at the root level
|
||||
const rootNoteId = "root";
|
||||
|
||||
const result = await noteCreateService.createNote(rootNoteId, {
|
||||
title: "New AI Chat",
|
||||
type: "aiChat",
|
||||
content: JSON.stringify({
|
||||
messages: [],
|
||||
title: "New AI Chat"
|
||||
})
|
||||
});
|
||||
|
||||
if (!result.note) {
|
||||
toastService.showError("Failed to create AI Chat note");
|
||||
return;
|
||||
}
|
||||
|
||||
await appContext.tabManager.openTabWithNoteWithHoisting(result.note.noteId, {
|
||||
activate: true
|
||||
});
|
||||
|
||||
toastService.showMessage("Created new AI Chat note");
|
||||
}
|
||||
catch (e) {
|
||||
console.error("Error creating AI Chat note:", e);
|
||||
toastService.showError(`Failed to create AI Chat note: ${(e as Error).message}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ const RELATION = "relation";
|
||||
* end user. Those types should be used only for checking against, they are
|
||||
* not for direct use.
|
||||
*/
|
||||
export type NoteType = "file" | "image" | "search" | "noteMap" | "launcher" | "doc" | "contentWidget" | "text" | "relationMap" | "render" | "canvas" | "mermaid" | "book" | "webView" | "code" | "mindMap" | "aiChat";
|
||||
export type NoteType = "file" | "image" | "search" | "noteMap" | "launcher" | "doc" | "contentWidget" | "text" | "relationMap" | "render" | "canvas" | "mermaid" | "book" | "webView" | "code" | "mindMap";
|
||||
|
||||
export interface NotePathRecord {
|
||||
isArchived: boolean;
|
||||
|
||||
@@ -17,8 +17,7 @@ export const byNoteType: Record<Exclude<NoteType, "book">, string | null> = {
|
||||
render: null,
|
||||
search: null,
|
||||
text: null,
|
||||
webView: null,
|
||||
aiChat: null
|
||||
webView: null
|
||||
};
|
||||
|
||||
export const byBookType: Record<ViewTypeOptions, string | null> = {
|
||||
|
||||
@@ -53,7 +53,6 @@ export const NOTE_TYPES: NoteTypeMapping[] = [
|
||||
{ type: "file", title: t("note_types.file"), reserved: true },
|
||||
{ type: "image", title: t("note_types.image"), reserved: true },
|
||||
{ type: "launcher", mime: "", title: t("note_types.launcher"), reserved: true },
|
||||
{ type: "aiChat", mime: "application/json", title: t("note_types.ai-chat"), reserved: true }
|
||||
];
|
||||
|
||||
/** The maximum age in days for a template to be marked with the "New" badge */
|
||||
|
||||
@@ -133,49 +133,6 @@ async function handleMessage(event: MessageEvent<any>) {
|
||||
appContext.triggerEvent("apiLogMessages", { noteId: message.noteId, messages: message.messages });
|
||||
} else if (message.type === "toast") {
|
||||
toastService.showMessage(message.message);
|
||||
} else if (message.type === "llm-stream") {
|
||||
// ENHANCED LOGGING FOR DEBUGGING
|
||||
console.log(`[WS-CLIENT] >>> RECEIVED LLM STREAM MESSAGE <<<`);
|
||||
console.log(`[WS-CLIENT] Message details: sessionId=${message.sessionId}, hasContent=${!!message.content}, contentLength=${message.content ? message.content.length : 0}, hasThinking=${!!message.thinking}, hasToolExecution=${!!message.toolExecution}, isDone=${!!message.done}`);
|
||||
|
||||
if (message.content) {
|
||||
console.log(`[WS-CLIENT] CONTENT PREVIEW: "${message.content.substring(0, 50)}..."`);
|
||||
}
|
||||
|
||||
// Create the event with detailed logging
|
||||
console.log(`[WS-CLIENT] Creating CustomEvent 'llm-stream-message'`);
|
||||
const llmStreamEvent = new CustomEvent('llm-stream-message', { detail: message });
|
||||
|
||||
// Dispatch to multiple targets to ensure delivery
|
||||
try {
|
||||
console.log(`[WS-CLIENT] Dispatching event to window`);
|
||||
window.dispatchEvent(llmStreamEvent);
|
||||
console.log(`[WS-CLIENT] Event dispatched to window`);
|
||||
|
||||
// Also try document for completeness
|
||||
console.log(`[WS-CLIENT] Dispatching event to document`);
|
||||
document.dispatchEvent(new CustomEvent('llm-stream-message', { detail: message }));
|
||||
console.log(`[WS-CLIENT] Event dispatched to document`);
|
||||
} catch (err) {
|
||||
console.error(`[WS-CLIENT] Error dispatching event:`, err);
|
||||
}
|
||||
|
||||
// Debug current listeners (though we can't directly check for specific event listeners)
|
||||
console.log(`[WS-CLIENT] Active event listeners should receive this message now`);
|
||||
|
||||
// Detailed logging based on message type
|
||||
if (message.content) {
|
||||
console.log(`[WS-CLIENT] Content message: ${message.content.length} chars`);
|
||||
} else if (message.thinking) {
|
||||
console.log(`[WS-CLIENT] Thinking update: "${message.thinking}"`);
|
||||
} else if (message.toolExecution) {
|
||||
console.log(`[WS-CLIENT] Tool execution: action=${message.toolExecution.action}, tool=${message.toolExecution.tool || 'unknown'}`);
|
||||
if (message.toolExecution.result) {
|
||||
console.log(`[WS-CLIENT] Tool result preview: "${String(message.toolExecution.result).substring(0, 50)}..."`);
|
||||
}
|
||||
} else if (message.done) {
|
||||
console.log(`[WS-CLIENT] Completion signal received`);
|
||||
}
|
||||
} else if (message.type === "execute-script") {
|
||||
// TODO: Remove after porting the file
|
||||
// @ts-ignore
|
||||
|
||||
@@ -1,450 +0,0 @@
|
||||
/* LLM Chat Panel Styles */
|
||||
.note-context-chat {
|
||||
background-color: var(--main-background-color);
|
||||
}
|
||||
|
||||
/* Message Styling */
|
||||
.chat-message {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.message-avatar {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
border-radius: 50%;
|
||||
font-size: 1.25rem;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.user-avatar {
|
||||
background-color: var(--input-background-color);
|
||||
color: var(--cmd-button-icon-color);
|
||||
}
|
||||
|
||||
.assistant-avatar {
|
||||
background-color: var(--subtle-border-color, var(--main-border-color));
|
||||
color: var(--hover-item-text-color);
|
||||
}
|
||||
|
||||
.message-content {
|
||||
max-width: calc(100% - 50px);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
||||
color: var(--main-text-color);
|
||||
}
|
||||
|
||||
.user-content {
|
||||
border-radius: 0.5rem 0.5rem 0 0.5rem !important;
|
||||
background-color: var(--input-background-color) !important;
|
||||
}
|
||||
|
||||
.assistant-content {
|
||||
border-radius: 0.5rem 0.5rem 0.5rem 0 !important;
|
||||
background-color: var(--main-background-color);
|
||||
border: 1px solid var(--subtle-border-color, var(--main-border-color));
|
||||
}
|
||||
|
||||
/* Tool Execution Styling */
|
||||
.tool-execution-info {
|
||||
margin-top: 0.75rem;
|
||||
margin-bottom: 1.5rem;
|
||||
border: 1px solid var(--subtle-border-color);
|
||||
border-radius: 0.5rem;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05);
|
||||
background-color: var(--main-background-color);
|
||||
/* Add a subtle transition effect */
|
||||
transition: all 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
.tool-execution-status {
|
||||
background-color: var(--accented-background-color, rgba(0, 0, 0, 0.03)) !important;
|
||||
border-radius: 0 !important;
|
||||
padding: 0.5rem !important;
|
||||
max-height: 250px !important;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.tool-execution-status .d-flex {
|
||||
border-bottom: 1px solid var(--subtle-border-color);
|
||||
padding-bottom: 0.5rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.tool-step {
|
||||
padding: 0.5rem;
|
||||
margin-bottom: 0.75rem;
|
||||
border-radius: 0.375rem;
|
||||
background-color: var(--main-background-color);
|
||||
border: 1px solid var(--subtle-border-color);
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.tool-step:hover {
|
||||
background-color: rgba(0, 0, 0, 0.01);
|
||||
}
|
||||
|
||||
.tool-step:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Tool step specific styling */
|
||||
.tool-step.executing {
|
||||
background-color: rgba(0, 123, 255, 0.05);
|
||||
border-color: rgba(0, 123, 255, 0.2);
|
||||
}
|
||||
|
||||
.tool-step.result {
|
||||
background-color: rgba(40, 167, 69, 0.05);
|
||||
border-color: rgba(40, 167, 69, 0.2);
|
||||
}
|
||||
|
||||
.tool-step.error {
|
||||
background-color: rgba(220, 53, 69, 0.05);
|
||||
border-color: rgba(220, 53, 69, 0.2);
|
||||
}
|
||||
|
||||
/* Tool result formatting */
|
||||
.tool-result pre {
|
||||
margin: 0.5rem 0;
|
||||
padding: 0.5rem;
|
||||
background-color: rgba(0, 0, 0, 0.03);
|
||||
border-radius: 0.25rem;
|
||||
overflow: auto;
|
||||
max-height: 300px;
|
||||
}
|
||||
|
||||
.tool-result code {
|
||||
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.tool-args code {
|
||||
display: block;
|
||||
padding: 0.5rem;
|
||||
background-color: rgba(0, 0, 0, 0.03);
|
||||
border-radius: 0.25rem;
|
||||
margin-top: 0.25rem;
|
||||
font-size: 0.85em;
|
||||
color: var(--muted-text-color);
|
||||
white-space: pre-wrap;
|
||||
overflow: auto;
|
||||
max-height: 100px;
|
||||
}
|
||||
|
||||
/* Tool Execution in Chat Styling */
|
||||
.chat-tool-execution {
|
||||
padding: 0 0 0 36px; /* Aligned with message content, accounting for avatar width */
|
||||
width: 100%;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.tool-execution-container {
|
||||
background-color: var(--accented-background-color, rgba(245, 247, 250, 0.7));
|
||||
border: 1px solid var(--subtle-border-color);
|
||||
border-radius: 0.375rem;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
||||
overflow: hidden;
|
||||
max-width: calc(100% - 20px);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.tool-execution-container.collapsed {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.tool-execution-header {
|
||||
background-color: var(--main-background-color);
|
||||
border-bottom: 1px solid var(--subtle-border-color);
|
||||
margin-bottom: 0.5rem;
|
||||
color: var(--muted-text-color);
|
||||
font-weight: 500;
|
||||
padding: 0.6rem 0.8rem;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.tool-execution-header:hover {
|
||||
background-color: var(--hover-item-background-color, rgba(0, 0, 0, 0.03));
|
||||
}
|
||||
|
||||
.tool-execution-toggle {
|
||||
color: var(--muted-text-color) !important;
|
||||
background: transparent !important;
|
||||
padding: 0.2rem 0.4rem !important;
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
|
||||
.tool-execution-toggle:hover {
|
||||
color: var(--main-text-color) !important;
|
||||
}
|
||||
|
||||
.tool-execution-toggle i.bx-chevron-down {
|
||||
transform: rotate(0deg);
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.tool-execution-toggle i.bx-chevron-right {
|
||||
transform: rotate(-90deg);
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.tool-execution-chat-steps {
|
||||
padding: 0.5rem;
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/* Make error text more visible */
|
||||
.text-danger {
|
||||
color: #dc3545 !important;
|
||||
}
|
||||
|
||||
/* Sources Styling */
|
||||
.sources-container {
|
||||
background-color: var(--accented-background-color, var(--main-background-color));
|
||||
border-top: 1px solid var(--main-border-color);
|
||||
color: var(--main-text-color);
|
||||
}
|
||||
|
||||
.source-item {
|
||||
transition: all 0.2s ease;
|
||||
background-color: var(--main-background-color);
|
||||
border-color: var(--subtle-border-color, var(--main-border-color)) !important;
|
||||
}
|
||||
|
||||
.source-item:hover {
|
||||
background-color: var(--link-hover-background, var(--hover-item-background-color));
|
||||
}
|
||||
|
||||
.source-link {
|
||||
color: var(--link-color, var(--hover-item-text-color));
|
||||
text-decoration: none;
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.source-link:hover {
|
||||
color: var(--link-hover-color, var(--hover-item-text-color));
|
||||
}
|
||||
|
||||
/* Input Area Styling */
|
||||
.note-context-chat-form {
|
||||
background-color: var(--main-background-color);
|
||||
border-top: 1px solid var(--main-border-color);
|
||||
}
|
||||
|
||||
.context-option-container {
|
||||
padding: 0.5rem 0;
|
||||
border-bottom: 1px solid var(--subtle-border-color, var(--main-border-color));
|
||||
color: var(--main-text-color);
|
||||
}
|
||||
|
||||
.chat-input-container {
|
||||
padding-top: 0.5rem;
|
||||
}
|
||||
|
||||
.note-context-chat-input {
|
||||
border-color: var(--subtle-border-color, var(--main-border-color));
|
||||
background-color: var(--input-background-color) !important;
|
||||
color: var(--input-text-color) !important;
|
||||
resize: none;
|
||||
transition: all 0.2s ease;
|
||||
min-height: 50px;
|
||||
max-height: 150px;
|
||||
}
|
||||
|
||||
.note-context-chat-input:focus {
|
||||
border-color: var(--input-focus-outline-color, var(--main-border-color));
|
||||
box-shadow: 0 0 0 0.25rem var(--input-focus-outline-color, rgba(13, 110, 253, 0.25));
|
||||
}
|
||||
|
||||
.note-context-chat-send-button {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
align-self: flex-end;
|
||||
background-color: var(--cmd-button-background-color) !important;
|
||||
color: var(--cmd-button-text-color) !important;
|
||||
}
|
||||
|
||||
/* Loading Indicator */
|
||||
.loading-indicator {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 1rem;
|
||||
color: var(--muted-text-color);
|
||||
}
|
||||
|
||||
/* Thinking display styles */
|
||||
.llm-thinking-container {
|
||||
margin: 1rem 0;
|
||||
animation: fadeInUp 0.3s ease-out;
|
||||
}
|
||||
|
||||
.thinking-bubble {
|
||||
background-color: var(--accented-background-color, var(--main-background-color));
|
||||
border: 1px solid var(--subtle-border-color, var(--main-border-color));
|
||||
border-radius: 0.75rem;
|
||||
padding: 0.75rem;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.thinking-bubble:hover {
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
.thinking-bubble::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
inset-inline-start: -100%;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, transparent, var(--hover-item-background-color, rgba(0, 0, 0, 0.03)), transparent);
|
||||
animation: shimmer 2s infinite;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.thinking-header {
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
border-radius: 0.375rem;
|
||||
}
|
||||
|
||||
.thinking-header:hover {
|
||||
background-color: var(--hover-item-background-color, rgba(0, 0, 0, 0.03));
|
||||
padding: 0.25rem;
|
||||
margin: -0.25rem;
|
||||
}
|
||||
|
||||
.thinking-dots {
|
||||
display: flex;
|
||||
gap: 3px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.thinking-dots span {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
background-color: var(--link-color, var(--hover-item-text-color));
|
||||
border-radius: 50%;
|
||||
animation: thinkingPulse 1.4s infinite ease-in-out;
|
||||
}
|
||||
|
||||
.thinking-dots span:nth-child(1) {
|
||||
animation-delay: -0.32s;
|
||||
}
|
||||
|
||||
.thinking-dots span:nth-child(2) {
|
||||
animation-delay: -0.16s;
|
||||
}
|
||||
|
||||
.thinking-dots span:nth-child(3) {
|
||||
animation-delay: 0s;
|
||||
}
|
||||
|
||||
.thinking-label {
|
||||
font-weight: 500;
|
||||
color: var(--link-color, var(--hover-item-text-color)) !important;
|
||||
}
|
||||
|
||||
.thinking-toggle {
|
||||
color: var(--muted-text-color) !important;
|
||||
transition: transform 0.2s ease;
|
||||
background: transparent !important;
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.thinking-toggle:hover {
|
||||
color: var(--main-text-color) !important;
|
||||
}
|
||||
|
||||
.thinking-toggle.expanded {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.thinking-content {
|
||||
margin-top: 0.75rem;
|
||||
padding-top: 0.75rem;
|
||||
border-top: 1px solid var(--subtle-border-color, var(--main-border-color));
|
||||
animation: expandDown 0.3s ease-out;
|
||||
}
|
||||
|
||||
.thinking-text {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
|
||||
font-size: 0.875rem;
|
||||
line-height: 1.5;
|
||||
color: var(--main-text-color);
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
background-color: var(--input-background-color);
|
||||
padding: 0.75rem;
|
||||
border-radius: 0.5rem;
|
||||
border: 1px solid var(--subtle-border-color, var(--main-border-color));
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.thinking-text:hover {
|
||||
border-color: var(--main-border-color);
|
||||
}
|
||||
|
||||
/* Animations */
|
||||
@keyframes thinkingPulse {
|
||||
0%, 80%, 100% {
|
||||
transform: scale(0.8);
|
||||
opacity: 0.6;
|
||||
}
|
||||
40% {
|
||||
transform: scale(1);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes shimmer {
|
||||
0% {
|
||||
inset-inline-start: -100%;
|
||||
}
|
||||
100% {
|
||||
inset-inline-start: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeInUp {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(10px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes expandDown {
|
||||
from {
|
||||
opacity: 0;
|
||||
max-height: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
max-height: 300px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Responsive adjustments */
|
||||
@media (max-width: 768px) {
|
||||
.thinking-bubble {
|
||||
margin: 0.5rem 0;
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.thinking-text {
|
||||
font-size: 0.8rem;
|
||||
padding: 0.5rem;
|
||||
max-height: 200px;
|
||||
}
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
/* LLM Chat Launcher Widget Styles */
|
||||
.note-context-chat {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.note-context-chat-container {
|
||||
flex-grow: 1;
|
||||
overflow-y: auto;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.chat-message {
|
||||
display: flex;
|
||||
margin-bottom: 15px;
|
||||
max-width: 85%;
|
||||
}
|
||||
|
||||
.chat-message.user-message {
|
||||
margin-inline-start: auto;
|
||||
}
|
||||
|
||||
.chat-message.assistant-message {
|
||||
margin-inline-end: auto;
|
||||
}
|
||||
|
||||
.message-avatar {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-inline-end: 8px;
|
||||
}
|
||||
|
||||
.user-message .message-avatar {
|
||||
background-color: var(--primary-color);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.assistant-message .message-avatar {
|
||||
background-color: var(--secondary-color);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.message-content {
|
||||
background-color: var(--more-accented-background-color);
|
||||
border-radius: 12px;
|
||||
padding: 10px 15px;
|
||||
max-width: calc(100% - 40px);
|
||||
}
|
||||
|
||||
.user-message .message-content {
|
||||
background-color: var(--accented-background-color);
|
||||
}
|
||||
|
||||
.message-content pre {
|
||||
background-color: var(--code-background-color);
|
||||
border-radius: 5px;
|
||||
padding: 10px;
|
||||
overflow-x: auto;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.message-content code {
|
||||
background-color: var(--code-background-color);
|
||||
padding: 2px 4px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.loading-indicator {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: 10px 0;
|
||||
color: var(--muted-text-color);
|
||||
}
|
||||
|
||||
.sources-container {
|
||||
background-color: var(--accented-background-color);
|
||||
border-top: 1px solid var(--main-border-color);
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.sources-list {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.source-item {
|
||||
padding: 4px 0;
|
||||
}
|
||||
|
||||
.source-link {
|
||||
color: var(--link-color);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.source-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.note-context-chat-form {
|
||||
display: flex;
|
||||
background-color: var(--main-background-color);
|
||||
border-top: 1px solid var(--main-border-color);
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.note-context-chat-input {
|
||||
resize: vertical;
|
||||
min-height: 44px;
|
||||
max-height: 200px;
|
||||
}
|
||||
|
||||
/* Responsive adjustments */
|
||||
@media (max-width: 768px) {
|
||||
.chat-message {
|
||||
max-width: 95%;
|
||||
}
|
||||
}
|
||||
@@ -566,113 +566,6 @@
|
||||
"enable-smooth-scroll": "تمكين التمرير السلس",
|
||||
"enable-motion": "تمكين الانتقالات والرسوم المتحركة"
|
||||
},
|
||||
"ai_llm": {
|
||||
"progress": "تقدم",
|
||||
"openai_tab": "OpenAI",
|
||||
"actions": "أجراءات",
|
||||
"retry": "أعد المحاولة",
|
||||
"reprocessing_index": "جار اعادة البناء...",
|
||||
"never": "ابدٱ",
|
||||
"agent": {
|
||||
"processing": "جار المعالجة...",
|
||||
"thinking": "جار التفكير...",
|
||||
"loading": "جار التحميل...",
|
||||
"generating": "جار الانشاء..."
|
||||
},
|
||||
"name": "الذكاء الأصطناعي",
|
||||
"openai": "OpenAI",
|
||||
"sources": "مصادر",
|
||||
"temperature": "درجة الحرارة",
|
||||
"model": "نموذج",
|
||||
"refreshing_models": "جار التحديث...",
|
||||
"error": "خطأ",
|
||||
"refreshing": "جار التحديث...",
|
||||
"ollama_tab": "Ollama",
|
||||
"anthropic_tab": "انتروبيك",
|
||||
"not_started": "لم يبدأ بعد",
|
||||
"title": "اعدادات AI",
|
||||
"processed_notes": "الملاحظات المعالجة",
|
||||
"total_notes": "الملاحظات الكلية",
|
||||
"queued_notes": "الملاحظات في قائمة الانتظار",
|
||||
"failed_notes": "الملاحظات الفاشلة",
|
||||
"last_processed": "اخر معالجة",
|
||||
"refresh_stats": "تحديث الاحصائيات",
|
||||
"voyage_tab": "استكشاف AI",
|
||||
"provider_precedence": "اولوية المزود",
|
||||
"system_prompt": "موجه النظام",
|
||||
"openai_configuration": "اعدادات OpenAI",
|
||||
"openai_settings": "اعدادات OpenAI",
|
||||
"api_key": "مفتاح واجهة برمجة التطبيقات",
|
||||
"url": "عنوان URL الاساسي",
|
||||
"default_model": "النموذج الافتراضي",
|
||||
"base_url": "عنوان URL الأساسي",
|
||||
"openai_url_description": "افتراضيا: https://api.openai.com/v1",
|
||||
"anthropic_settings": "اعدادات انتروبيك",
|
||||
"ollama_settings": "اعدادات Ollama",
|
||||
"anthropic_configuration": "تهيئة انتروبيك",
|
||||
"voyage_url_description": "افتراضيا: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "تهيئة Ollama",
|
||||
"enable_ollama": "تمكين Ollama",
|
||||
"last_attempt": "اخر محاولة",
|
||||
"active_providers": "المزودون النشطون",
|
||||
"disabled_providers": "المزودون المعطلون",
|
||||
"similarity_threshold": "عتبة التشابه",
|
||||
"complete": "اكتمل (100%)",
|
||||
"ai_settings": "اعدادات AI",
|
||||
"show_thinking": "عرض التفكير",
|
||||
"index_status": "حالة الفهرس",
|
||||
"indexed_notes": "الملاحظات المفهرسة",
|
||||
"indexing_stopped": "تم ايقاف الفهرسة",
|
||||
"last_indexed": "اخر فهرسة",
|
||||
"note_chat": "دردشة الملاحظة",
|
||||
"start_indexing": "بدء الفهرسة",
|
||||
"chat": {
|
||||
"root_note_title": "دردشات AI",
|
||||
"new_chat_title": "دردشة جديدة",
|
||||
"create_new_ai_chat": "انشاء دردشة AI جديدة"
|
||||
},
|
||||
"selected_provider": "المزود المحدد",
|
||||
"select_model": "اختر النموذج...",
|
||||
"select_provider": "اختر المزود...",
|
||||
"ollama_model": "نموذج Ollama",
|
||||
"refresh_models": "تحديث النماذج",
|
||||
"rebuild_index": "اعادة بناء الفهرس",
|
||||
"note_title": "عنوان الملاحظة",
|
||||
"processing": "جاري المعالجة ({{percentage}}%)",
|
||||
"incomplete": "غير مكتمل ({{percentage}}%)",
|
||||
"ollama_url": "عنوان URL الخاص ب Ollama",
|
||||
"provider_configuration": "تكوين موفر AI",
|
||||
"voyage_settings": "استكشاف اعدادات AI",
|
||||
"enable_automatic_indexing": "تمكين الفهرسة التلقائية",
|
||||
"index_rebuild_progress": "تقدم اعادة انشاء الفهرس",
|
||||
"index_rebuild_complete": "اكتملت عملية تحسين الفهرس",
|
||||
"use_enhanced_context": "استخدام السياق المحسن",
|
||||
"enter_message": "ادخل رسالتك...",
|
||||
"index_all_notes": "فهرسة جميع الملاحظات",
|
||||
"indexing_in_progress": "جار فهرسة الملاحظات...",
|
||||
"use_advanced_context": "استخدم السياق المتقدم",
|
||||
"ai_enabled": "تمكين مميزات AI",
|
||||
"ai_disabled": "الغاء تمكين مميزات AI",
|
||||
"enable_ai_features": "تمكين خصائص AI/LLM",
|
||||
"enable_ai": "تمكين خصائص AI/LLM",
|
||||
"reprocess_index": "اعادة بناء فهرس البحث",
|
||||
"index_rebuilding": "جار تحسين الفهرس {{percentage}}",
|
||||
"voyage_configuration": "اعدادت Voyage AI",
|
||||
"openai_model_description": "الامثلة: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"partial": "{{ percentage }} % مكتمل",
|
||||
"retry_queued": "تم جدولة الملاحظة لاعادة المحاولة",
|
||||
"max_notes_per_llm_query": "اكبر عدد للملاحظات لكل استعلام",
|
||||
"remove_provider": "احذف المزود من البحث",
|
||||
"restore_provider": "استعادة المزود الى البحث",
|
||||
"reprocess_index_error": "حدث خطأ اثناء اعادة بناء فهرس البحث",
|
||||
"auto_refresh_notice": "تحديث تلقائي كل {{seconds}} ثانية",
|
||||
"note_queued_for_retry": "الملاحظة جاهزة لاعادة المحاولة لاحقا",
|
||||
"failed_to_retry_note": "فشل في اعادة محاولة معالجة المحاولة",
|
||||
"failed_to_retry_all": "فشل في اعادة محاولة معالجة الملاحظة",
|
||||
"error_generating_response": "فشل في توليد استجابة من ال AI",
|
||||
"create_new_ai_chat": "انشاء دردشة AI جديدة",
|
||||
"error_fetching": "فشل في استرجاع النماذج: {{error}}"
|
||||
},
|
||||
"code_auto_read_only_size": {
|
||||
"unit": "حروف",
|
||||
"title": "الحجم التلقائي للقراءه فقط"
|
||||
@@ -910,7 +803,6 @@
|
||||
"web-view": "عرض الويب",
|
||||
"mind-map": "خريطة ذهنية",
|
||||
"geo-map": "خريطة جغرافية",
|
||||
"ai-chat": "دردشة AI",
|
||||
"task-list": "قائمة المهام"
|
||||
},
|
||||
"shared_switch": {
|
||||
|
||||
@@ -1532,7 +1532,6 @@
|
||||
"geo-map": "地理地图",
|
||||
"beta-feature": "测试版",
|
||||
"task-list": "任务列表",
|
||||
"ai-chat": "AI聊天",
|
||||
"new-feature": "新建",
|
||||
"collections": "集合",
|
||||
"book": "集合"
|
||||
@@ -1839,149 +1838,6 @@
|
||||
"yesterday": "昨天"
|
||||
}
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "未开始",
|
||||
"title": "AI设置",
|
||||
"processed_notes": "已处理笔记",
|
||||
"total_notes": "笔记总数",
|
||||
"progress": "进度",
|
||||
"queued_notes": "排队中笔记",
|
||||
"failed_notes": "失败笔记",
|
||||
"last_processed": "最后处理时间",
|
||||
"refresh_stats": "刷新统计数据",
|
||||
"enable_ai_features": "启用AI/LLM功能",
|
||||
"enable_ai_description": "启用笔记摘要、内容生成等AI功能及其他LLM能力",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "启用AI/LLM功能",
|
||||
"enable_ai_desc": "启用笔记摘要、内容生成等AI功能及其他LLM能力",
|
||||
"provider_configuration": "AI提供商配置",
|
||||
"provider_precedence": "提供商优先级",
|
||||
"provider_precedence_description": "按优先级排序的提供商列表(用逗号分隔,例如:'openai,anthropic,ollama')",
|
||||
"temperature": "温度参数",
|
||||
"temperature_description": "控制响应的随机性(0 = 确定性输出,2 = 最大随机性)",
|
||||
"system_prompt": "系统提示词",
|
||||
"system_prompt_description": "所有AI交互使用的默认系统提示词",
|
||||
"openai_configuration": "OpenAI配置",
|
||||
"openai_settings": "OpenAI设置",
|
||||
"api_key": "API密钥",
|
||||
"url": "基础URL",
|
||||
"model": "模型",
|
||||
"openai_api_key_description": "用于访问OpenAI服务的API密钥",
|
||||
"anthropic_api_key_description": "用于访问Claude模型的Anthropic API密钥",
|
||||
"default_model": "默认模型",
|
||||
"openai_model_description": "示例:gpt-4o、gpt-4-turbo、gpt-3.5-turbo",
|
||||
"base_url": "基础URL",
|
||||
"openai_url_description": "默认:https://api.openai.com/v1",
|
||||
"anthropic_settings": "Anthropic设置",
|
||||
"anthropic_url_description": "Anthropic API的基础URL(默认:https://api.anthropic.com)",
|
||||
"anthropic_model_description": "用于聊天补全的Anthropic Claude模型",
|
||||
"voyage_settings": "Voyage AI设置",
|
||||
"ollama_settings": "Ollama设置",
|
||||
"ollama_url_description": "Ollama API的URL(默认:http://localhost:11434)",
|
||||
"ollama_model_description": "用于聊天补全的 Ollama 模型",
|
||||
"anthropic_configuration": "Anthropic配置",
|
||||
"voyage_configuration": "Voyage AI配置",
|
||||
"voyage_url_description": "默认:https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Ollama配置",
|
||||
"enable_ollama": "启用Ollama",
|
||||
"enable_ollama_description": "启用Ollama以使用本地AI模型",
|
||||
"ollama_url": "Ollama URL",
|
||||
"ollama_model": "Ollama模型",
|
||||
"refresh_models": "刷新模型",
|
||||
"refreshing_models": "刷新中...",
|
||||
"enable_automatic_indexing": "启用自动索引",
|
||||
"rebuild_index": "重建索引",
|
||||
"rebuild_index_error": "启动索引重建失败。请查看日志了解详情。",
|
||||
"note_title": "笔记标题",
|
||||
"error": "错误",
|
||||
"last_attempt": "最后尝试时间",
|
||||
"actions": "操作",
|
||||
"retry": "重试",
|
||||
"partial": "{{ percentage }}% 已完成",
|
||||
"retry_queued": "笔记已加入重试队列",
|
||||
"retry_failed": "笔记加入重试队列失败",
|
||||
"max_notes_per_llm_query": "每次查询的最大笔记数",
|
||||
"max_notes_per_llm_query_description": "AI上下文包含的最大相似笔记数量",
|
||||
"active_providers": "活跃提供商",
|
||||
"disabled_providers": "已禁用提供商",
|
||||
"remove_provider": "从搜索中移除提供商",
|
||||
"restore_provider": "将提供商恢复到搜索中",
|
||||
"similarity_threshold": "相似度阈值",
|
||||
"similarity_threshold_description": "纳入LLM查询上下文的笔记最低相似度分数(0-1)",
|
||||
"reprocess_index": "重建搜索索引",
|
||||
"reprocessing_index": "重建中...",
|
||||
"reprocess_index_started": "搜索索引优化已在后台启动",
|
||||
"reprocess_index_error": "重建搜索索引失败",
|
||||
"index_rebuild_progress": "索引重建进度",
|
||||
"index_rebuilding": "正在优化索引({{percentage}}%)",
|
||||
"index_rebuild_complete": "索引优化完成",
|
||||
"index_rebuild_status_error": "检查索引重建状态失败",
|
||||
"never": "从未",
|
||||
"processing": "处理中({{percentage}}%)",
|
||||
"incomplete": "未完成({{percentage}}%)",
|
||||
"complete": "已完成(100%)",
|
||||
"refreshing": "刷新中...",
|
||||
"auto_refresh_notice": "每 {{seconds}} 秒自动刷新",
|
||||
"note_queued_for_retry": "笔记已加入重试队列",
|
||||
"failed_to_retry_note": "重试笔记失败",
|
||||
"all_notes_queued_for_retry": "所有失败笔记已加入重试队列",
|
||||
"failed_to_retry_all": "重试笔记失败",
|
||||
"ai_settings": "AI设置",
|
||||
"api_key_tooltip": "用于访问服务的API密钥",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "Anthropic API密钥为空。请输入有效的API密钥。",
|
||||
"openai": "OpenAI API密钥为空。请输入有效的API密钥。",
|
||||
"voyage": "Voyage API密钥为空。请输入有效的API密钥。",
|
||||
"ollama": "Ollama API密钥为空。请输入有效的API密钥。"
|
||||
},
|
||||
"agent": {
|
||||
"processing": "处理中...",
|
||||
"thinking": "思考中...",
|
||||
"loading": "加载中...",
|
||||
"generating": "生成中..."
|
||||
},
|
||||
"name": "AI",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "使用增强上下文",
|
||||
"enhanced_context_description": "为AI提供来自笔记及其相关笔记的更多上下文,以获得更好的响应",
|
||||
"show_thinking": "显示思考过程",
|
||||
"show_thinking_description": "显示AI的思维链过程",
|
||||
"enter_message": "输入你的消息...",
|
||||
"error_contacting_provider": "联系AI提供商失败。请检查你的设置和网络连接。",
|
||||
"error_generating_response": "生成AI响应失败",
|
||||
"index_all_notes": "为所有笔记建立索引",
|
||||
"index_status": "索引状态",
|
||||
"indexed_notes": "已索引笔记",
|
||||
"indexing_stopped": "索引已停止",
|
||||
"indexing_in_progress": "索引进行中...",
|
||||
"last_indexed": "最后索引时间",
|
||||
"note_chat": "笔记聊天",
|
||||
"sources": "来源",
|
||||
"start_indexing": "开始索引",
|
||||
"use_advanced_context": "使用高级上下文",
|
||||
"ollama_no_url": "Ollama 未配置。请输入有效的URL。",
|
||||
"chat": {
|
||||
"root_note_title": "AI聊天记录",
|
||||
"root_note_content": "此笔记包含你保存的AI聊天对话。",
|
||||
"new_chat_title": "新聊天",
|
||||
"create_new_ai_chat": "创建新的AI聊天"
|
||||
},
|
||||
"create_new_ai_chat": "创建新的AI聊天",
|
||||
"configuration_warnings": "你的AI配置存在一些问题。请检查你的设置。",
|
||||
"experimental_warning": "LLM功能目前处于实验阶段 - 特此提醒。",
|
||||
"selected_provider": "已选提供商",
|
||||
"selected_provider_description": "选择用于聊天和补全功能的AI提供商",
|
||||
"select_model": "选择模型...",
|
||||
"select_provider": "选择提供商...",
|
||||
"ai_enabled": "已启用 AI 功能",
|
||||
"ai_disabled": "已禁用 AI 功能",
|
||||
"no_models_found_online": "找不到模型。请检查您的 API 密钥及设置。",
|
||||
"no_models_found_ollama": "找不到 Ollama 模型。请确认 Ollama 是否正在运行。",
|
||||
"error_fetching": "获取模型失败:{{error}}"
|
||||
},
|
||||
"code-editor-options": {
|
||||
"title": "编辑器"
|
||||
},
|
||||
|
||||
@@ -1795,149 +1795,6 @@
|
||||
"close": "Schließen",
|
||||
"help_title": "Zeige mehr Informationen zu diesem Fenster"
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "Nicht gestartet",
|
||||
"title": "KI Einstellungen",
|
||||
"processed_notes": "Verarbeitete Notizen",
|
||||
"total_notes": "Gesamt Notizen",
|
||||
"progress": "Fortschritt",
|
||||
"queued_notes": "Eingereihte Notizen",
|
||||
"failed_notes": "Fehlgeschlagenen Notizen",
|
||||
"last_processed": "Zuletzt verarbeitet",
|
||||
"refresh_stats": "Statistiken neu laden",
|
||||
"enable_ai_features": "Aktiviere KI/LLM Funktionen",
|
||||
"enable_ai_description": "Aktiviere KI-Funktionen wie Notizzusammenfassungen, Inhaltserzeugung und andere LLM-Funktionen",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Aktiviere KI/LLM Funktionen",
|
||||
"enable_ai_desc": "Aktiviere KI-Funktionen wie Notizzusammenfassungen, Inhaltserzeugung und andere LLM-Funktionen",
|
||||
"provider_configuration": "KI-Anbieterkonfiguration",
|
||||
"provider_precedence": "Anbieter Priorität",
|
||||
"provider_precedence_description": "Komma-getrennte Liste von Anbieter in der Reihenfolge ihrer Priorität (z.B. 'openai, anthropic,ollama')",
|
||||
"temperature": "Temperatur",
|
||||
"temperature_description": "Regelt die Zufälligkeit in Antworten (0 = deterministisch, 2 = maximale Zufälligkeit)",
|
||||
"system_prompt": "Systemaufforderung",
|
||||
"system_prompt_description": "Standard Systemaufforderung für alle KI-Interaktionen",
|
||||
"openai_configuration": "OpenAI Konfiguration",
|
||||
"openai_settings": "OpenAI Einstellungen",
|
||||
"api_key": "API Schlüssel",
|
||||
"url": "Basis-URL",
|
||||
"model": "Modell",
|
||||
"anthropic_settings": "Anthropic Einstellungen",
|
||||
"partial": "{{ percentage }}% verarbeitet",
|
||||
"anthropic_api_key_description": "Dein Anthropic API-Key für den Zugriff auf Claude Modelle",
|
||||
"anthropic_model_description": "Anthropic Claude Modell für Chat-Vervollständigung",
|
||||
"voyage_settings": "Einstellungen für Voyage AI",
|
||||
"ollama_url_description": "URL für die Ollama API (Standard: http://localhost:11434)",
|
||||
"ollama_model_description": "Ollama Modell für Chat-Vervollständigung",
|
||||
"anthropic_configuration": "Anthropic Konfiguration",
|
||||
"voyage_configuration": "Voyage AI Konfiguration",
|
||||
"voyage_url_description": "Standard: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Ollama Konfiguration",
|
||||
"enable_ollama": "Aktiviere Ollama",
|
||||
"enable_ollama_description": "Aktiviere Ollama für lokale KI Modell Nutzung",
|
||||
"ollama_url": "Ollama URL",
|
||||
"ollama_model": "Ollama Modell",
|
||||
"refresh_models": "Aktualisiere Modelle",
|
||||
"refreshing_models": "Aktualisiere...",
|
||||
"enable_automatic_indexing": "Aktiviere automatische Indizierung",
|
||||
"rebuild_index": "Index neu aufbauen",
|
||||
"rebuild_index_error": "Fehler beim Neuaufbau des Index. Prüfe Log für mehr Informationen.",
|
||||
"retry_failed": "Fehler: Notiz konnte nicht erneut eingereiht werden",
|
||||
"max_notes_per_llm_query": "Max. Notizen je Abfrage",
|
||||
"max_notes_per_llm_query_description": "Maximale Anzahl ähnlicher Notizen zum Einbinden als KI Kontext",
|
||||
"active_providers": "Aktive Anbieter",
|
||||
"disabled_providers": "Inaktive Anbieter",
|
||||
"remove_provider": "Entferne Anbieter von Suche",
|
||||
"restore_provider": "Anbieter zur Suche wiederherstellen",
|
||||
"similarity_threshold": "Ähnlichkeitsschwelle",
|
||||
"similarity_threshold_description": "Mindestähnlichkeitswert (0-1) für Notizen, die im Kontext für LLM-Abfragen berücksichtigt werden sollen",
|
||||
"reprocess_index": "Suchindex neu erstellen",
|
||||
"reprocessing_index": "Neuerstellung...",
|
||||
"reprocess_index_started": "Suchindex-Optimierung wurde im Hintergrund gestartet",
|
||||
"reprocess_index_error": "Fehler beim Wiederaufbau des Suchindex",
|
||||
"index_rebuild_progress": "Fortschritt der Index-Neuerstellung",
|
||||
"index_rebuilding": "Optimierung Index ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Index Optimierung abgeschlossen",
|
||||
"index_rebuild_status_error": "Fehler bei Überprüfung Status Index Neuerstellung",
|
||||
"never": "Niemals",
|
||||
"processing": "Verarbeitung ({{percentage}}%)",
|
||||
"refreshing": "Aktualisiere...",
|
||||
"incomplete": "Unvollständig ({{percentage}}%)",
|
||||
"complete": "Abgeschlossen (100%)",
|
||||
"auto_refresh_notice": "Auto-Aktualisierung alle {{seconds}} Sekunden",
|
||||
"note_queued_for_retry": "Notiz in Warteschlange für erneuten Versuch hinzugefügt",
|
||||
"failed_to_retry_note": "Wiederholungsversuch fehlgeschlagen für Notiz",
|
||||
"ai_settings": "KI Einstellungen",
|
||||
"agent": {
|
||||
"processing": "Verarbeite...",
|
||||
"thinking": "Nachdenken...",
|
||||
"loading": "Lade...",
|
||||
"generating": "Generiere..."
|
||||
},
|
||||
"name": "KI",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Benutze verbesserten Kontext",
|
||||
"openai_api_key_description": "Dein OpenAPI-Key für den Zugriff auf den KI-Dienst",
|
||||
"default_model": "Standardmodell",
|
||||
"openai_model_description": "Beispiele: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "Basis URL",
|
||||
"openai_url_description": "Standard: https://api.openai.com/v1",
|
||||
"anthropic_url_description": "Basis URL für Anthropic API (Standard: https://api.anthropic.com)",
|
||||
"ollama_settings": "Ollama Einstellungen",
|
||||
"note_title": "Notiz Titel",
|
||||
"error": "Fehler",
|
||||
"last_attempt": "Letzter Versuch",
|
||||
"actions": "Aktionen",
|
||||
"retry": "Erneut versuchen",
|
||||
"retry_queued": "Notiz für weiteren Versuch eingereiht",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "Anthropic API-Key ist leer. Bitte gültigen API-Key eingeben.",
|
||||
"openai": "OpenAI API-Key ist leer. Bitte gültigen API-Key eingeben.",
|
||||
"voyage": "Voyage API-Key ist leer. Bitte gültigen API-Key eingeben.",
|
||||
"ollama": "Ollama API-Key ist leer. Bitte gültigen API-Key eingeben."
|
||||
},
|
||||
"api_key_tooltip": "API-Key für den Zugriff auf den Dienst",
|
||||
"failed_to_retry_all": "Wiederholungsversuch für Notizen fehlgeschlagen",
|
||||
"all_notes_queued_for_retry": "Alle fehlgeschlagenen Notizen wurden zur Wiederholung in die Warteschlange gestellt",
|
||||
"enhanced_context_description": "Versorgt die KI mit mehr Kontext aus der Notiz und den zugehörigen Notizen, um bessere Antworten zu ermöglichen",
|
||||
"show_thinking": "Zeige Denkprozess",
|
||||
"show_thinking_description": "Zeige den Denkprozess der KI",
|
||||
"enter_message": "Geben Sie Ihre Nachricht ein...",
|
||||
"error_contacting_provider": "Fehler beim Kontaktieren des KI-Anbieters. Bitte überprüfe die Einstellungen und die Internetverbindung.",
|
||||
"error_generating_response": "Fehler beim Generieren der KI Antwort",
|
||||
"index_all_notes": "Indiziere alle Notizen",
|
||||
"index_status": "Indizierungsstatus",
|
||||
"indexed_notes": "Indizierte Notizen",
|
||||
"indexing_stopped": "Indizierung gestoppt",
|
||||
"indexing_in_progress": "Indizierung in Bearbeitung...",
|
||||
"last_indexed": "Zuletzt Indiziert",
|
||||
"note_chat": "Notizen-Chat",
|
||||
"sources": "Quellen",
|
||||
"start_indexing": "Starte Indizierung",
|
||||
"use_advanced_context": "Benutze erweiterten Kontext",
|
||||
"ollama_no_url": "Ollama ist nicht konfiguriert. Bitte trage eine gültige URL ein.",
|
||||
"chat": {
|
||||
"root_note_title": "KI Chats",
|
||||
"root_note_content": "Diese Notiz enthält gespeicherte KI-Chat-Unterhaltungen.",
|
||||
"new_chat_title": "Neuer Chat",
|
||||
"create_new_ai_chat": "Erstelle neuen KI Chat"
|
||||
},
|
||||
"create_new_ai_chat": "Erstelle neuen KI Chat",
|
||||
"configuration_warnings": "Es wurden Probleme mit der KI Konfiguration festgestellt. Bitte überprüfe die Einstellungen.",
|
||||
"experimental_warning": "Die LLM-Funktionen sind aktuell experimentell - sei an dieser Stelle gewarnt.",
|
||||
"selected_provider": "Ausgewählter Anbieter",
|
||||
"selected_provider_description": "Wähle einen KI-Anbieter für Chat- und Vervollständigungsfunktionen",
|
||||
"select_model": "Wähle Modell...",
|
||||
"select_provider": "Wähle Anbieter...",
|
||||
"ai_enabled": "KI Funktionen aktiviert",
|
||||
"ai_disabled": "KI Funktionen deaktiviert",
|
||||
"no_models_found_online": "Keine Modelle gefunden. Bitte überprüfe den API-Key und die Einstellungen.",
|
||||
"no_models_found_ollama": "Kein Ollama Modell gefunden. Bitte prüfe, ob Ollama gerade läuft.",
|
||||
"error_fetching": "Fehler beim Abrufen der Modelle: {{error}}"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "Verlasse Zen Modus"
|
||||
},
|
||||
|
||||
@@ -47,11 +47,6 @@
|
||||
"attachment_detail_2": {
|
||||
"unrecognized_role": "Unrecognised attachment role '{{role}}'."
|
||||
},
|
||||
"ai_llm": {
|
||||
"reprocess_index_started": "Search index optimisation started in the background",
|
||||
"index_rebuilding": "Optimising index ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Index optimisation complete"
|
||||
},
|
||||
"highlighting": {
|
||||
"color-scheme": "Colour Scheme"
|
||||
},
|
||||
|
||||
@@ -1204,149 +1204,6 @@
|
||||
"enable-smooth-scroll": "Enable smooth scrolling",
|
||||
"app-restart-required": "(a restart of the application is required for the change to take effect)"
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "Not started",
|
||||
"title": "AI Settings",
|
||||
"processed_notes": "Processed Notes",
|
||||
"total_notes": "Total Notes",
|
||||
"progress": "Progress",
|
||||
"queued_notes": "Queued Notes",
|
||||
"failed_notes": "Failed Notes",
|
||||
"last_processed": "Last Processed",
|
||||
"refresh_stats": "Refresh Statistics",
|
||||
"enable_ai_features": "Enable AI/LLM features",
|
||||
"enable_ai_description": "Enable AI features like note summarization, content generation, and other LLM capabilities",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Enable AI/LLM features",
|
||||
"enable_ai_desc": "Enable AI features like note summarization, content generation, and other LLM capabilities",
|
||||
"provider_configuration": "AI Provider Configuration",
|
||||
"provider_precedence": "Provider Precedence",
|
||||
"provider_precedence_description": "Comma-separated list of providers in order of precedence (e.g., 'openai,anthropic,ollama')",
|
||||
"temperature": "Temperature",
|
||||
"temperature_description": "Controls randomness in responses (0 = deterministic, 2 = maximum randomness)",
|
||||
"system_prompt": "System Prompt",
|
||||
"system_prompt_description": "Default system prompt used for all AI interactions",
|
||||
"openai_configuration": "OpenAI Configuration",
|
||||
"openai_settings": "OpenAI Settings",
|
||||
"api_key": "API Key",
|
||||
"url": "Base URL",
|
||||
"model": "Model",
|
||||
"openai_api_key_description": "Your OpenAI API key for accessing their AI services",
|
||||
"anthropic_api_key_description": "Your Anthropic API key for accessing Claude models",
|
||||
"default_model": "Default Model",
|
||||
"openai_model_description": "Examples: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "Base URL",
|
||||
"openai_url_description": "Default: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Anthropic Settings",
|
||||
"anthropic_url_description": "Base URL for the Anthropic API (default: https://api.anthropic.com)",
|
||||
"anthropic_model_description": "Anthropic Claude models for chat completion",
|
||||
"voyage_settings": "Voyage AI Settings",
|
||||
"ollama_settings": "Ollama Settings",
|
||||
"ollama_url_description": "URL for the Ollama API (default: http://localhost:11434)",
|
||||
"ollama_model_description": "Ollama model to use for chat completion",
|
||||
"anthropic_configuration": "Anthropic Configuration",
|
||||
"voyage_configuration": "Voyage AI Configuration",
|
||||
"voyage_url_description": "Default: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Ollama Configuration",
|
||||
"enable_ollama": "Enable Ollama",
|
||||
"enable_ollama_description": "Enable Ollama for local AI model usage",
|
||||
"ollama_url": "Ollama URL",
|
||||
"ollama_model": "Ollama Model",
|
||||
"refresh_models": "Refresh Models",
|
||||
"refreshing_models": "Refreshing...",
|
||||
"enable_automatic_indexing": "Enable Automatic Indexing",
|
||||
"rebuild_index": "Rebuild Index",
|
||||
"rebuild_index_error": "Error starting index rebuild. Check logs for details.",
|
||||
"note_title": "Note Title",
|
||||
"error": "Error",
|
||||
"last_attempt": "Last Attempt",
|
||||
"actions": "Actions",
|
||||
"retry": "Retry",
|
||||
"partial": "{{ percentage }}% completed",
|
||||
"retry_queued": "Note queued for retry",
|
||||
"retry_failed": "Failed to queue note for retry",
|
||||
"max_notes_per_llm_query": "Max Notes Per Query",
|
||||
"max_notes_per_llm_query_description": "Maximum number of similar notes to include in AI context",
|
||||
"active_providers": "Active Providers",
|
||||
"disabled_providers": "Disabled Providers",
|
||||
"remove_provider": "Remove provider from search",
|
||||
"restore_provider": "Restore provider to search",
|
||||
"similarity_threshold": "Similarity Threshold",
|
||||
"similarity_threshold_description": "Minimum similarity score (0-1) for notes to be included in context for LLM queries",
|
||||
"reprocess_index": "Rebuild Search Index",
|
||||
"reprocessing_index": "Rebuilding...",
|
||||
"reprocess_index_started": "Search index optimization started in the background",
|
||||
"reprocess_index_error": "Error rebuilding search index",
|
||||
"index_rebuild_progress": "Index Rebuild Progress",
|
||||
"index_rebuilding": "Optimizing index ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Index optimization complete",
|
||||
"index_rebuild_status_error": "Error checking index rebuild status",
|
||||
"never": "Never",
|
||||
"processing": "Processing ({{percentage}}%)",
|
||||
"incomplete": "Incomplete ({{percentage}}%)",
|
||||
"complete": "Complete (100%)",
|
||||
"refreshing": "Refreshing...",
|
||||
"auto_refresh_notice": "Auto-refreshes every {{seconds}} seconds",
|
||||
"note_queued_for_retry": "Note queued for retry",
|
||||
"failed_to_retry_note": "Failed to retry note",
|
||||
"all_notes_queued_for_retry": "All failed notes queued for retry",
|
||||
"failed_to_retry_all": "Failed to retry notes",
|
||||
"ai_settings": "AI Settings",
|
||||
"api_key_tooltip": "API key for accessing the service",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "Anthropic API key is empty. Please enter a valid API key.",
|
||||
"openai": "OpenAI API key is empty. Please enter a valid API key.",
|
||||
"voyage": "Voyage API key is empty. Please enter a valid API key.",
|
||||
"ollama": "Ollama API key is empty. Please enter a valid API key."
|
||||
},
|
||||
"agent": {
|
||||
"processing": "Processing...",
|
||||
"thinking": "Thinking...",
|
||||
"loading": "Loading...",
|
||||
"generating": "Generating..."
|
||||
},
|
||||
"name": "AI",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Use enhanced context",
|
||||
"enhanced_context_description": "Provides the AI with more context from the note and its related notes for better responses",
|
||||
"show_thinking": "Show thinking",
|
||||
"show_thinking_description": "Show the AI's chain of thought process",
|
||||
"enter_message": "Enter your message...",
|
||||
"error_contacting_provider": "Error contacting AI provider. Please check your settings and internet connection.",
|
||||
"error_generating_response": "Error generating AI response",
|
||||
"index_all_notes": "Index All Notes",
|
||||
"index_status": "Index Status",
|
||||
"indexed_notes": "Indexed Notes",
|
||||
"indexing_stopped": "Indexing stopped",
|
||||
"indexing_in_progress": "Indexing in progress...",
|
||||
"last_indexed": "Last Indexed",
|
||||
"note_chat": "Note Chat",
|
||||
"sources": "Sources",
|
||||
"start_indexing": "Start Indexing",
|
||||
"use_advanced_context": "Use Advanced Context",
|
||||
"ollama_no_url": "Ollama is not configured. Please enter a valid URL.",
|
||||
"chat": {
|
||||
"root_note_title": "AI Chats",
|
||||
"root_note_content": "This note contains your saved AI chat conversations.",
|
||||
"new_chat_title": "New Chat",
|
||||
"create_new_ai_chat": "Create new AI Chat"
|
||||
},
|
||||
"create_new_ai_chat": "Create new AI Chat",
|
||||
"configuration_warnings": "There are some issues with your AI configuration. Please check your settings.",
|
||||
"experimental_warning": "The LLM feature is currently experimental - you have been warned.",
|
||||
"selected_provider": "Selected Provider",
|
||||
"selected_provider_description": "Choose the AI provider for chat and completion features",
|
||||
"select_model": "Select model...",
|
||||
"select_provider": "Select provider...",
|
||||
"ai_enabled": "AI features enabled",
|
||||
"ai_disabled": "AI features disabled",
|
||||
"no_models_found_online": "No models found. Please check your API key and settings.",
|
||||
"no_models_found_ollama": "No Ollama models found. Please check if Ollama is running.",
|
||||
"error_fetching": "Error fetching models: {{error}}"
|
||||
},
|
||||
"zoom_factor": {
|
||||
"title": "Zoom Factor (desktop build only)",
|
||||
"description": "Zooming can be controlled with CTRL+- and CTRL+= shortcuts as well."
|
||||
|
||||
@@ -1175,149 +1175,6 @@
|
||||
"light_theme": "Heredado (Claro)",
|
||||
"dark_theme": "Heredado (Oscuro)"
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "No iniciado",
|
||||
"title": "IA y ajustes de embeddings",
|
||||
"processed_notes": "Notas procesadas",
|
||||
"total_notes": "Notas totales",
|
||||
"progress": "Progreso",
|
||||
"queued_notes": "Notas en fila",
|
||||
"failed_notes": "Notas fallidas",
|
||||
"last_processed": "Última procesada",
|
||||
"refresh_stats": "Recargar estadísticas",
|
||||
"enable_ai_features": "Habilitar características IA/LLM",
|
||||
"enable_ai_description": "Habilitar características de IA como resumen de notas, generación de contenido y otras capacidades LLM",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Habilitar características IA/LLM",
|
||||
"enable_ai_desc": "Habilitar características de IA como resumen de notas, generación de contenido y otras capacidades LLM",
|
||||
"provider_configuration": "Configuración de proveedor de IA",
|
||||
"provider_precedence": "Precedencia de proveedor",
|
||||
"provider_precedence_description": "Lista de proveedores en orden de precedencia separada por comas (p.e., 'openai,anthropic,ollama')",
|
||||
"temperature": "Temperatura",
|
||||
"temperature_description": "Controla la aleatoriedad de las respuestas (0 = determinista, 2 = aleatoriedad máxima)",
|
||||
"system_prompt": "Mensaje de sistema",
|
||||
"system_prompt_description": "Mensaje de sistema predeterminado utilizado para todas las interacciones de IA",
|
||||
"openai_configuration": "Configuración de OpenAI",
|
||||
"openai_settings": "Ajustes de OpenAI",
|
||||
"api_key": "Clave API",
|
||||
"url": "URL base",
|
||||
"model": "Modelo",
|
||||
"openai_api_key_description": "Tu clave API de OpenAI para acceder a sus servicios de IA",
|
||||
"anthropic_api_key_description": "Tu clave API de Anthropic para acceder a los modelos Claude",
|
||||
"default_model": "Modelo por defecto",
|
||||
"openai_model_description": "Ejemplos: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "URL base",
|
||||
"openai_url_description": "Por defecto: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Ajustes de Anthropic",
|
||||
"anthropic_url_description": "URL base para la API de Anthropic (por defecto: https://api.anthropic.com)",
|
||||
"anthropic_model_description": "Modelos Claude de Anthropic para el completado de chat",
|
||||
"voyage_settings": "Ajustes de Voyage AI",
|
||||
"ollama_settings": "Ajustes de Ollama",
|
||||
"ollama_url_description": "URL para la API de Ollama (por defecto: http://localhost:11434)",
|
||||
"ollama_model_description": "Modelo de Ollama a usar para el completado de chat",
|
||||
"anthropic_configuration": "Configuración de Anthropic",
|
||||
"voyage_configuration": "Configuración de Voyage AI",
|
||||
"voyage_url_description": "Por defecto: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Configuración de Ollama",
|
||||
"enable_ollama": "Habilitar Ollama",
|
||||
"enable_ollama_description": "Habilitar Ollama para uso de modelo de IA local",
|
||||
"ollama_url": "URL de Ollama",
|
||||
"ollama_model": "Modelo de Ollama",
|
||||
"refresh_models": "Refrescar modelos",
|
||||
"refreshing_models": "Refrescando...",
|
||||
"enable_automatic_indexing": "Habilitar indexado automático",
|
||||
"rebuild_index": "Recrear índice",
|
||||
"rebuild_index_error": "Error al comenzar la reconstrucción del índice. Consulte los registros para más detalles.",
|
||||
"note_title": "Título de nota",
|
||||
"error": "Error",
|
||||
"last_attempt": "Último intento",
|
||||
"actions": "Acciones",
|
||||
"retry": "Reintentar",
|
||||
"partial": "{{ percentage }}% completado",
|
||||
"retry_queued": "Nota en la cola para reintento",
|
||||
"retry_failed": "Hubo un fallo al poner en la cola a la nota para reintento",
|
||||
"max_notes_per_llm_query": "Máximo de notas por consulta",
|
||||
"max_notes_per_llm_query_description": "Número máximo de notas similares a incluir en el contexto IA",
|
||||
"active_providers": "Proveedores activos",
|
||||
"disabled_providers": "Proveedores deshabilitados",
|
||||
"remove_provider": "Eliminar proveedor de la búsqueda",
|
||||
"restore_provider": "Restaurar proveedor a la búsqueda",
|
||||
"similarity_threshold": "Bias de similaridad",
|
||||
"similarity_threshold_description": "Puntuación de similaridad mínima (0-1) para incluir notas en el contexto para consultas LLM",
|
||||
"reprocess_index": "Reconstruir el índice de búsqueda",
|
||||
"reprocessing_index": "Reconstruyendo...",
|
||||
"reprocess_index_started": "La optimización de índice de búsqueda comenzó en segundo plano",
|
||||
"reprocess_index_error": "Error al reconstruir el índice de búsqueda",
|
||||
"index_rebuild_progress": "Progreso de reconstrucción de índice",
|
||||
"index_rebuilding": "Optimizando índice ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Optimización de índice completa",
|
||||
"index_rebuild_status_error": "Error al comprobar el estado de reconstrucción del índice",
|
||||
"never": "Nunca",
|
||||
"processing": "Procesando ({{percentage}}%)",
|
||||
"incomplete": "Incompleto ({{percentage}}%)",
|
||||
"complete": "Completo (100%)",
|
||||
"refreshing": "Refrescando...",
|
||||
"auto_refresh_notice": "Refrescar automáticamente cada {{seconds}} segundos",
|
||||
"note_queued_for_retry": "Nota en la cola para reintento",
|
||||
"failed_to_retry_note": "Hubo un fallo al reintentar nota",
|
||||
"all_notes_queued_for_retry": "Todas las notas con fallo agregadas a la cola para reintento",
|
||||
"failed_to_retry_all": "Hubo un fallo al reintentar notas",
|
||||
"ai_settings": "Ajustes de IA",
|
||||
"api_key_tooltip": "Clave API para acceder al servicio",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "La clave API de Anthropic está vacía. Por favor, ingrese una clave API válida.",
|
||||
"openai": "La clave API de OpenAI está vacía. Por favor, ingrese una clave API válida.",
|
||||
"voyage": "La clave API de Voyage está vacía. Por favor, ingrese una clave API válida.",
|
||||
"ollama": "La clave API de Ollama está vacía. Por favor, ingrese una clave API válida."
|
||||
},
|
||||
"agent": {
|
||||
"processing": "Procesando...",
|
||||
"thinking": "Pensando...",
|
||||
"loading": "Cargando...",
|
||||
"generating": "Generando..."
|
||||
},
|
||||
"name": "IA",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Utilizar contexto mejorado",
|
||||
"enhanced_context_description": "Provee a la IA con más contexto de la nota y sus notas relacionadas para obtener mejores respuestas",
|
||||
"show_thinking": "Mostrar pensamiento",
|
||||
"show_thinking_description": "Mostrar la cadena del proceso de pensamiento de la IA",
|
||||
"enter_message": "Ingrese su mensaje...",
|
||||
"error_contacting_provider": "Error al contactar con su proveedor de IA. Por favor compruebe sus ajustes y conexión a internet.",
|
||||
"error_generating_response": "Error al generar respuesta de IA",
|
||||
"index_all_notes": "Indexar todas las notas",
|
||||
"index_status": "Estado de índice",
|
||||
"indexed_notes": "Notas indexadas",
|
||||
"indexing_stopped": "Indexado detenido",
|
||||
"indexing_in_progress": "Indexado en progreso...",
|
||||
"last_indexed": "Último indexado",
|
||||
"note_chat": "Chat de nota",
|
||||
"sources": "Fuentes",
|
||||
"start_indexing": "Comenzar indexado",
|
||||
"use_advanced_context": "Usar contexto avanzado",
|
||||
"ollama_no_url": "Ollama no está configurado. Por favor ingrese una URL válida.",
|
||||
"chat": {
|
||||
"root_note_title": "Chats de IA",
|
||||
"root_note_content": "Esta nota contiene tus conversaciones de chat de IA guardadas.",
|
||||
"new_chat_title": "Nuevo chat",
|
||||
"create_new_ai_chat": "Crear nuevo chat de IA"
|
||||
},
|
||||
"create_new_ai_chat": "Crear nuevo chat de IA",
|
||||
"configuration_warnings": "Hay algunos problemas con su configuración de IA. Por favor compruebe sus ajustes.",
|
||||
"experimental_warning": "La característica de LLM aún es experimental - ha sido advertido.",
|
||||
"selected_provider": "Proveedor seleccionado",
|
||||
"selected_provider_description": "Elija el proveedor de IA para el chat y características de completado",
|
||||
"select_model": "Seleccionar modelo...",
|
||||
"select_provider": "Seleccionar proveedor...",
|
||||
"ai_enabled": "Características de IA activadas",
|
||||
"ai_disabled": "Características de IA desactivadas",
|
||||
"no_models_found_online": "No se encontraron modelos. Por favor, comprueba tu clave de API y la configuración.",
|
||||
"no_models_found_ollama": "No se encontraron modelos de Ollama. Por favor, comprueba si Ollama se está ejecutando.",
|
||||
"error_fetching": "Error al obtener los modelos: {{error}}"
|
||||
},
|
||||
"zoom_factor": {
|
||||
"title": "Factor de zoom (solo versión de escritorio)",
|
||||
"description": "El zoom también se puede controlar con los atajos CTRL+- y CTRL+=."
|
||||
|
||||
@@ -1485,7 +1485,6 @@
|
||||
"beta-feature": "Beta",
|
||||
"task-list": "Liste de tâches",
|
||||
"book": "Collection",
|
||||
"ai-chat": "Chat IA",
|
||||
"new-feature": "Nouveau",
|
||||
"collections": "Collections"
|
||||
},
|
||||
@@ -1798,149 +1797,6 @@
|
||||
"close": "Fermer",
|
||||
"help_title": "Afficher plus d'informations sur cet écran"
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "Non démarré",
|
||||
"title": "Paramètres IA",
|
||||
"processed_notes": "Notes traitées",
|
||||
"anthropic_url_description": "URL de base pour l'API Anthropic (par défaut : https ://api.anthropic.com)",
|
||||
"anthropic_model_description": "Modèles Anthropic Claude pour la complétion",
|
||||
"voyage_settings": "Réglages d'IA Voyage",
|
||||
"ollama_settings": "Réglages Ollama",
|
||||
"ollama_url_description": "URL pour l'API Ollama (par défaut: http://localhost:11434)",
|
||||
"ollama_model_description": "Model Ollama utilisé pour la complétion",
|
||||
"anthropic_configuration": "Configuration Anthropic",
|
||||
"voyage_configuration": "Configuration IA Voyage",
|
||||
"voyage_url_description": "Défaut: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Configuration Ollama",
|
||||
"total_notes": "Notes totales",
|
||||
"progress": "Progrès",
|
||||
"queued_notes": "Notes dans la file d'attente",
|
||||
"refresh_stats": "Rafraîchir les statistiques",
|
||||
"enable_ai_features": "Activer les fonctionnalités IA/LLM",
|
||||
"enable_ai_description": "Activer les fonctionnalités IA telles que le résumé des notes, la génération de contenu et autres fonctionnalités LLM",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Activer les fonctionnalités IA/LLM",
|
||||
"enable_ai_desc": "Activer les fonctionnalités IA telles que le résumé des notes, la génération de contenu et autres fonctionnalités LLM",
|
||||
"provider_configuration": "Configuration du fournisseur IA",
|
||||
"provider_precedence_description": "Liste de fournisseurs séparés par virgule, par ordre de préférence (ex. 'openai,anthopic,ollama')",
|
||||
"temperature": "Température",
|
||||
"temperature_description": "Contrôle de l'aléatoirité dans les réponses (0 = déterministe, 2 = hasard maximum)",
|
||||
"system_prompt": "Prompt système",
|
||||
"system_prompt_description": "Prompt système par défaut pour toutes les intéractions IA",
|
||||
"openai_configuration": "Configuration OpenAI",
|
||||
"openai_settings": "Options OpenAI",
|
||||
"api_key": "Clef API",
|
||||
"url": "URL de base",
|
||||
"model": "Modèle",
|
||||
"openai_api_key_description": "Votre clef API OpenAI pour accéder à leurs services IA",
|
||||
"anthropic_api_key_description": "Votre clef API Anthropic pour accéder aux modèles Claude",
|
||||
"default_model": "Modèle par défaut",
|
||||
"openai_model_description": "Exemples : gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "URL de base",
|
||||
"openai_url_description": "Défaut : https://api.openai.com/v1",
|
||||
"anthropic_settings": "Réglages Anthropic",
|
||||
"enable_ollama": "Activer Ollama",
|
||||
"enable_ollama_description": "Activer Ollama comme modèle d'IA local",
|
||||
"ollama_url": "URL Ollama",
|
||||
"ollama_model": "Modèle Ollama",
|
||||
"refresh_models": "Rafraîchir les modèles",
|
||||
"refreshing_models": "Mise à jour...",
|
||||
"enable_automatic_indexing": "Activer l'indexage automatique",
|
||||
"rebuild_index": "Rafraîchir l'index",
|
||||
"rebuild_index_error": "Erreur dans le démarrage du rafraichissement de l'index. Veuillez consulter les logs pour plus de détails.",
|
||||
"note_title": "Titre de la note",
|
||||
"error": "Erreur",
|
||||
"last_attempt": "Dernier essai",
|
||||
"actions": "Actions",
|
||||
"retry": "Réessayer",
|
||||
"partial": "Complété à {{ percentage }}%",
|
||||
"retry_queued": "Note ajoutée à la file d'attente",
|
||||
"retry_failed": "Echec de l'ajout de la note à la file d'attente",
|
||||
"max_notes_per_llm_query": "Notes maximum par requête",
|
||||
"max_notes_per_llm_query_description": "Nombre maximum de notes similaires à inclure dans le contexte IA",
|
||||
"active_providers": "Fournisseurs actifs",
|
||||
"disabled_providers": "Fournisseurs désactivés",
|
||||
"remove_provider": "Retirer le fournisseur de la recherche",
|
||||
"similarity_threshold": "Seuil de similarité",
|
||||
"similarity_threshold_description": "Seuil de similarité minimum (0-1) pour que inclure les notes dans le contexte d'une requête IA",
|
||||
"reprocess_index": "Rafraîchir l'index de recherche",
|
||||
"reprocessing_index": "Mise à jour...",
|
||||
"reprocess_index_started": "L'optimisation de l'indice de recherche à commencer en arrière-plan",
|
||||
"reprocess_index_error": "Erreur dans le rafraichissement de l'indice de recherche",
|
||||
"failed_notes": "Notes en erreur",
|
||||
"last_processed": "Dernier traitement",
|
||||
"restore_provider": "Restaurer le fournisseur de recherche",
|
||||
"index_rebuild_progress": "Progression de la reconstruction de l'index",
|
||||
"index_rebuilding": "Optimisation de l'index ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Optimisation de l'index terminée",
|
||||
"index_rebuild_status_error": "Erreur lors de la vérification de l'état de reconstruction de l'index",
|
||||
"provider_precedence": "Priorité du fournisseur",
|
||||
"never": "Jamais",
|
||||
"processing": "Traitement en cours ({{percentage}}%)",
|
||||
"incomplete": "Incomplet ({{percentage}}%)",
|
||||
"complete": "Terminé (100%)",
|
||||
"refreshing": "Mise à jour...",
|
||||
"auto_refresh_notice": "Actualisation automatique toutes les {{seconds}} secondes",
|
||||
"note_queued_for_retry": "Note mise en file d'attente pour une nouvelle tentative",
|
||||
"failed_to_retry_note": "Échec de la nouvelle tentative de note",
|
||||
"all_notes_queued_for_retry": "Toutes les notes ayant échoué sont mises en file d'attente pour une nouvelle tentative",
|
||||
"failed_to_retry_all": "Échec du ré essai des notes",
|
||||
"ai_settings": "Paramètres IA",
|
||||
"api_key_tooltip": "Clé API pour accéder au service",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "La clé API Anthropic est vide. Veuillez saisir une clé API valide.",
|
||||
"openai": "La clé API OpenAI est vide. Veuillez saisir une clé API valide.",
|
||||
"voyage": "La clé API Voyage est vide. Veuillez saisir une clé API valide.",
|
||||
"ollama": "La clé API Ollama est vide. Veuillez saisir une clé API valide."
|
||||
},
|
||||
"agent": {
|
||||
"processing": "Traitement...",
|
||||
"thinking": "Réflexion...",
|
||||
"loading": "Chargement...",
|
||||
"generating": "Génération..."
|
||||
},
|
||||
"name": "IA",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Utiliser un contexte amélioré",
|
||||
"enhanced_context_description": "Fournit à l'IA plus de contexte à partir de la note et de ses notes associées pour de meilleures réponses",
|
||||
"show_thinking": "Montrer la réflexion",
|
||||
"show_thinking_description": "Montrer la chaîne de pensée de l'IA",
|
||||
"enter_message": "Entrez votre message...",
|
||||
"error_contacting_provider": "Erreur lors de la connexion au fournisseur d'IA. Veuillez vérifier vos paramètres et votre connexion Internet.",
|
||||
"error_generating_response": "Erreur lors de la génération de la réponse de l'IA",
|
||||
"index_all_notes": "Indexer toutes les notes",
|
||||
"index_status": "Statut de l'index",
|
||||
"indexed_notes": "Notes indexées",
|
||||
"indexing_stopped": "Arrêt de l'indexation",
|
||||
"indexing_in_progress": "Indexation en cours...",
|
||||
"last_indexed": "Dernière indexée",
|
||||
"note_chat": "Note discussion",
|
||||
"sources": "Sources",
|
||||
"start_indexing": "Démarrage de l'indexation",
|
||||
"use_advanced_context": "Utiliser le contexte avancé",
|
||||
"ollama_no_url": "Ollama n'est pas configuré. Veuillez saisir une URL valide.",
|
||||
"chat": {
|
||||
"root_note_title": "Discussions IA",
|
||||
"root_note_content": "Cette note contient vos conversations de chat IA enregistrées.",
|
||||
"new_chat_title": "Nouvelle discussion",
|
||||
"create_new_ai_chat": "Créer une nouvelle discussion IA"
|
||||
},
|
||||
"create_new_ai_chat": "Créer une nouvelle discussion IA",
|
||||
"configuration_warnings": "Il y a quelques problèmes avec la configuration de votre IA. Veuillez vérifier vos paramètres.",
|
||||
"experimental_warning": "La fonctionnalité LLM est actuellement expérimentale – vous êtes prévenu.",
|
||||
"selected_provider": "Fournisseur sélectionné",
|
||||
"selected_provider_description": "Choisissez le fournisseur d’IA pour les fonctionnalités de discussion et de complétion",
|
||||
"select_model": "Sélectionner le modèle...",
|
||||
"select_provider": "Sélectionnez un fournisseur...",
|
||||
"ai_enabled": "Fonctionnalités d'IA activées",
|
||||
"ai_disabled": "Fonctionnalités d'IA désactivées",
|
||||
"no_models_found_online": "Aucun modèle trouvé. Veuillez vérifier votre clé API et vos paramètres.",
|
||||
"no_models_found_ollama": "Aucun modèle Ollama trouvé. Veuillez vérifier si Ollama est en cours d'exécution.",
|
||||
"error_fetching": "Erreur lors de la récupération des modèles : {{error}}"
|
||||
},
|
||||
"ui-performance": {
|
||||
"title": "Performance",
|
||||
"enable-motion": "Activer les transitions et animations",
|
||||
|
||||
@@ -1193,149 +1193,6 @@
|
||||
"enable-smooth-scroll": "Cumasaigh scrollú réidh",
|
||||
"app-restart-required": "(tá atosú an fheidhmchláir ag teastáil chun an t-athrú a chur i bhfeidhm)"
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "Níor tosaíodh",
|
||||
"title": "Socruithe AI",
|
||||
"processed_notes": "Nótaí Próiseáilte",
|
||||
"total_notes": "Nótaí Iomlána",
|
||||
"progress": "Dul Chun Cinn",
|
||||
"queued_notes": "Nótaí i gCiú",
|
||||
"failed_notes": "Nótaí Theipthe",
|
||||
"last_processed": "Próiseáilte Deiridh",
|
||||
"refresh_stats": "Athnuachan Staitisticí",
|
||||
"enable_ai_features": "Cumasaigh gnéithe AI/LLM",
|
||||
"enable_ai_description": "Cumasaigh gnéithe AI cosúil le achoimre nótaí, giniúint ábhair, agus cumais LLM eile",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Cumasaigh gnéithe AI/LLM",
|
||||
"enable_ai_desc": "Cumasaigh gnéithe AI cosúil le achoimre nótaí, giniúint ábhair, agus cumais LLM eile",
|
||||
"provider_configuration": "Cumraíocht Soláthraí AI",
|
||||
"provider_precedence": "Tosaíocht Soláthraí",
|
||||
"provider_precedence_description": "Liosta soláthraithe scartha le camóga in ord tosaíochta (m.sh., 'openai, anthropic, ollama')",
|
||||
"temperature": "Teocht",
|
||||
"temperature_description": "Rialaíonn randamacht i bhfreagraí (0 = cinntitheach, 2 = uasmhéid randamachta)",
|
||||
"system_prompt": "Pras Córais",
|
||||
"system_prompt_description": "Leid réamhshocraithe an chórais a úsáidtear le haghaidh gach idirghníomhaíocht AI",
|
||||
"openai_configuration": "Cumraíocht OpenAI",
|
||||
"openai_settings": "Socruithe OpenAI",
|
||||
"api_key": "Eochair API",
|
||||
"url": "Bun-URL",
|
||||
"model": "Samhail",
|
||||
"openai_api_key_description": "D'eochair API OpenAI chun rochtain a fháil ar a gcuid seirbhísí AI",
|
||||
"anthropic_api_key_description": "D'eochair API Anthropic chun rochtain a fháil ar mhúnlaí Claude",
|
||||
"default_model": "Samhail Réamhshocraithe",
|
||||
"openai_model_description": "Samplaí: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "Bun-URL",
|
||||
"openai_url_description": "Réamhshocrú: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Socruithe Anthropic",
|
||||
"anthropic_url_description": "Bun-URL don Anthropic API (réamhshocraithe: https://api.anthropic.com)",
|
||||
"anthropic_model_description": "Samhlacha Anthropic Claude le haghaidh comhlánú comhrá",
|
||||
"voyage_settings": "Socruithe Voyage AI",
|
||||
"ollama_settings": "Socruithe Ollama",
|
||||
"ollama_url_description": "URL don Ollama API (réamhshocrú: http://localhost:11434)",
|
||||
"ollama_model_description": "Samhail Ollama le húsáid le haghaidh comhrá a chríochnú",
|
||||
"anthropic_configuration": "Cumraíocht Anthropic",
|
||||
"voyage_configuration": "Cumraíocht AI Voyage",
|
||||
"voyage_url_description": "Réamhshocrú: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Cumraíocht Ollama",
|
||||
"enable_ollama": "Cumasaigh Ollama",
|
||||
"enable_ollama_description": "Cumasaigh Ollama le haghaidh úsáide áitiúla samhail AI",
|
||||
"ollama_url": "URL Ollama",
|
||||
"ollama_model": "Samhail Ollama",
|
||||
"refresh_models": "Athnuachan Samhlacha",
|
||||
"refreshing_models": "Ag athnuachan...",
|
||||
"enable_automatic_indexing": "Cumasaigh Innéacsú Uathoibríoch",
|
||||
"rebuild_index": "Innéacs Athchóirithe",
|
||||
"rebuild_index_error": "Earráid ag tosú atógáil an innéacs. Seiceáil na logaí le haghaidh sonraí.",
|
||||
"note_title": "Teideal an Nóta",
|
||||
"error": "Earráid",
|
||||
"last_attempt": "Iarracht Dheiridh",
|
||||
"actions": "Gníomhartha",
|
||||
"retry": "Déan iarracht eile",
|
||||
"partial": "{{ percentage }}% críochnaithe",
|
||||
"retry_queued": "Nóta curtha i scuaine le haghaidh athiarrachta",
|
||||
"retry_failed": "Theip ar an nóta a chur sa scuaine le haghaidh athiarrachta",
|
||||
"max_notes_per_llm_query": "Uasmhéid Nótaí In Aghaidh an Fhiosrúcháin",
|
||||
"max_notes_per_llm_query_description": "Uasmhéid nótaí comhchosúla le cur san áireamh i gcomhthéacs na hintleachta saorga",
|
||||
"active_providers": "Soláthraithe Gníomhacha",
|
||||
"disabled_providers": "Soláthraithe faoi Mhíchumas",
|
||||
"remove_provider": "Bain an soláthraí as an gcuardach",
|
||||
"restore_provider": "Athchóirigh soláthraí chuig an gcuardach",
|
||||
"similarity_threshold": "Tairseach Cosúlachta",
|
||||
"similarity_threshold_description": "Scór cosúlachta íosta (0-1) le go n-áireofar nótaí i gcomhthéacs fiosrúcháin LLM",
|
||||
"reprocess_index": "Athchruthaigh Innéacs Cuardaigh",
|
||||
"reprocessing_index": "Atógáil...",
|
||||
"reprocess_index_started": "Cuireadh tús le hoptamú innéacs cuardaigh sa chúlra",
|
||||
"reprocess_index_error": "Earráid ag atógáil innéacs cuardaigh",
|
||||
"index_rebuild_progress": "Dul Chun Cinn Athchóirithe Innéacs",
|
||||
"index_rebuilding": "Innéacs optamaithe ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Uasmhéadú innéacs críochnaithe",
|
||||
"index_rebuild_status_error": "Earráid ag seiceáil stádas athchóirithe innéacs",
|
||||
"never": "Choíche",
|
||||
"processing": "Próiseáil ({{percentage}}%)",
|
||||
"incomplete": "Neamhchríochnaithe ({{percentage}}%)",
|
||||
"complete": "Críochnaithe (100%)",
|
||||
"refreshing": "Ag athnuachan...",
|
||||
"auto_refresh_notice": "Athnuachan uathoibríoch gach {{seconds}} soicind",
|
||||
"note_queued_for_retry": "Nóta curtha i scuaine le haghaidh athiarrachta",
|
||||
"failed_to_retry_note": "Theip ar an nóta a athdhéanamh",
|
||||
"all_notes_queued_for_retry": "Gach nóta nár éirigh leo curtha i scuaine le haghaidh athiarrachta",
|
||||
"failed_to_retry_all": "Theip ar athiarracht nótaí",
|
||||
"ai_settings": "Socruithe AI",
|
||||
"api_key_tooltip": "Eochair API chun rochtain a fháil ar an tseirbhís",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "Tá eochair API Anthropic folamh. Cuir isteach eochair API bhailí le do thoil.",
|
||||
"openai": "Tá eochair API OpenAI folamh. Cuir isteach eochair API bhailí le do thoil.",
|
||||
"voyage": "Tá eochair API Voyage folamh. Cuir isteach eochair API bhailí le do thoil.",
|
||||
"ollama": "Tá eochair API Ollama folamh. Cuir isteach eochair API bhailí le do thoil."
|
||||
},
|
||||
"agent": {
|
||||
"processing": "Ag próiseáil...",
|
||||
"thinking": "Ag smaoineamh...",
|
||||
"loading": "Ag lódáil...",
|
||||
"generating": "Ag giniúint..."
|
||||
},
|
||||
"name": "Intleacht Shaorga",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Úsáid comhthéacs feabhsaithe",
|
||||
"enhanced_context_description": "Tugann sé níos mó comhthéacs don AI ón nóta agus a nótaí gaolmhara le haghaidh freagraí níos fearr",
|
||||
"show_thinking": "Taispeáin smaointeoireacht",
|
||||
"show_thinking_description": "Taispeáin slabhra phróiseas smaointeoireachta na hintleachta saorga",
|
||||
"enter_message": "Cuir isteach do theachtaireacht...",
|
||||
"error_contacting_provider": "Earráid ag teacht i dteagmháil leis an soláthraí AI. Seiceáil do shocruithe agus do nasc idirlín le do thoil.",
|
||||
"error_generating_response": "Earráid ag giniúint freagra AI",
|
||||
"index_all_notes": "Innéacs na Nótaí Uile",
|
||||
"index_status": "Stádas Innéacs",
|
||||
"indexed_notes": "Nótaí Innéacsaithe",
|
||||
"indexing_stopped": "Stopadh an innéacsú",
|
||||
"indexing_in_progress": "Innéacsú ar siúl...",
|
||||
"last_indexed": "Innéacsaithe Deiridh",
|
||||
"note_chat": "Comhrá Nótaí",
|
||||
"sources": "Foinsí",
|
||||
"start_indexing": "Tosaigh ag Innéacsú",
|
||||
"use_advanced_context": "Úsáid Comhthéacs Ardleibhéil",
|
||||
"ollama_no_url": "Níl Ollama cumraithe. Cuir isteach URL bailí le do thoil.",
|
||||
"chat": {
|
||||
"root_note_title": "Comhráite AI",
|
||||
"root_note_content": "Tá do chomhráite comhrá AI sábháilte sa nóta seo.",
|
||||
"new_chat_title": "Comhrá Nua",
|
||||
"create_new_ai_chat": "Cruthaigh Comhrá AI nua"
|
||||
},
|
||||
"create_new_ai_chat": "Cruthaigh Comhrá AI nua",
|
||||
"configuration_warnings": "Tá roinnt fadhbanna le do chumraíocht AI. Seiceáil do shocruithe le do thoil.",
|
||||
"experimental_warning": "Tá an ghné LLM turgnamhach faoi láthair - tugadh rabhadh duit.",
|
||||
"selected_provider": "Soláthraí Roghnaithe",
|
||||
"selected_provider_description": "Roghnaigh an soláthraí AI le haghaidh gnéithe comhrá agus comhlánaithe",
|
||||
"select_model": "Roghnaigh samhail...",
|
||||
"select_provider": "Roghnaigh soláthraí...",
|
||||
"ai_enabled": "Gnéithe AI cumasaithe",
|
||||
"ai_disabled": "Gnéithe AI díchumasaithe",
|
||||
"no_models_found_online": "Níor aimsíodh aon mhúnlaí. Seiceáil d’eochair API agus do shocruithe le do thoil.",
|
||||
"no_models_found_ollama": "Níor aimsíodh aon mhúnlaí Ollama. Seiceáil le do thoil an bhfuil Ollama ag rith.",
|
||||
"error_fetching": "Earráid ag fáil samhlacha: {{error}}"
|
||||
},
|
||||
"zoom_factor": {
|
||||
"title": "Fachtóir Súmáil (leagan deisce amháin)",
|
||||
"description": "Is féidir súmáil a rialú le haicearraí CTRL+- agus CTRL+= chomh maith."
|
||||
|
||||
@@ -663,149 +663,6 @@
|
||||
"thursday": "Giovedì",
|
||||
"friday": "Venerdì"
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "Non iniziato",
|
||||
"title": "Impostazioni AI",
|
||||
"processed_notes": "Note elaborate",
|
||||
"total_notes": "Note totali",
|
||||
"progress": "Progressi",
|
||||
"queued_notes": "Note in coda",
|
||||
"failed_notes": "Note non riuscite",
|
||||
"last_processed": "Ultimo elaborato",
|
||||
"refresh_stats": "Aggiorna statistiche",
|
||||
"enable_ai_features": "Abilita le funzionalità AI/LLM",
|
||||
"enable_ai_description": "Abilita funzionalità di intelligenza artificiale come il riepilogo delle note, la generazione di contenuti e altre funzionalità LLM",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Antropico",
|
||||
"voyage_tab": "Viaggio AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Abilita le funzionalità AI/LLM",
|
||||
"enable_ai_desc": "Abilita funzionalità di intelligenza artificiale come il riepilogo delle note, la generazione di contenuti e altre funzionalità LLM",
|
||||
"provider_configuration": "Configurazione del fornitore di intelligenza artificiale",
|
||||
"provider_precedence": "Precedenza del fornitore",
|
||||
"provider_precedence_description": "Elenco dei provider separati da virgole in ordine di precedenza (ad esempio, 'openai,anthropic,ollama')",
|
||||
"temperature": "Temperatura",
|
||||
"temperature_description": "Controlla la casualità nelle risposte (0 = deterministico, 2 = casualità massima)",
|
||||
"system_prompt": "Prompt di sistema",
|
||||
"system_prompt_description": "Prompt di sistema predefinito utilizzato per tutte le interazioni con l'IA",
|
||||
"openai_configuration": "Configurazione OpenAI",
|
||||
"openai_settings": "Impostazioni OpenAI",
|
||||
"api_key": "Chiave API",
|
||||
"url": "URL di base",
|
||||
"model": "Modello",
|
||||
"openai_api_key_description": "La tua chiave API OpenAI per accedere ai loro servizi di intelligenza artificiale",
|
||||
"anthropic_api_key_description": "La tua chiave API Anthropic per accedere ai modelli Claude",
|
||||
"default_model": "Modello predefinito",
|
||||
"openai_model_description": "Esempi: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "URL di base",
|
||||
"openai_url_description": "Predefinito: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Ambientazioni antropiche",
|
||||
"anthropic_url_description": "URL di base per l'API Anthropic (predefinito: https://api.anthropic.com)",
|
||||
"anthropic_model_description": "Modelli di Anthropic Claude per il completamento della chat",
|
||||
"voyage_settings": "Impostazioni AI di Voyage",
|
||||
"ollama_settings": "Impostazioni Ollama",
|
||||
"ollama_url_description": "URL per l'API Ollama (predefinito: http://localhost:11434)",
|
||||
"ollama_model_description": "Modello Ollama da utilizzare per il completamento della chat",
|
||||
"anthropic_configuration": "Configurazione antropica",
|
||||
"voyage_configuration": "Configurazione AI di viaggio",
|
||||
"voyage_url_description": "Predefinito: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Configurazione Ollama",
|
||||
"enable_ollama": "Abilita Ollama",
|
||||
"enable_ollama_description": "Abilita Ollama per l'utilizzo del modello AI locale",
|
||||
"ollama_url": "URL di Ollama",
|
||||
"ollama_model": "Modello Ollama",
|
||||
"refresh_models": "Aggiorna modelli",
|
||||
"refreshing_models": "Rinfrescante...",
|
||||
"enable_automatic_indexing": "Abilita l'indicizzazione automatica",
|
||||
"rebuild_index": "Ricostruisci indice",
|
||||
"rebuild_index_error": "Errore durante l'avvio della ricostruzione dell'indice. Controllare i log per i dettagli.",
|
||||
"note_title": "Titolo della nota",
|
||||
"error": "Errore",
|
||||
"last_attempt": "Ultimo tentativo",
|
||||
"actions": "Azioni",
|
||||
"retry": "Riprova",
|
||||
"partial": "{{ percentage }}% completato",
|
||||
"retry_queued": "Nota in coda per un nuovo tentativo",
|
||||
"retry_failed": "Impossibile mettere in coda la nota per un nuovo tentativo",
|
||||
"max_notes_per_llm_query": "Numero massimo di note per query",
|
||||
"max_notes_per_llm_query_description": "Numero massimo di note simili da includere nel contesto AI",
|
||||
"active_providers": "Fornitori attivi",
|
||||
"disabled_providers": "Fornitori disabili",
|
||||
"remove_provider": "Rimuovi il fornitore dalla ricerca",
|
||||
"restore_provider": "Ripristina il provider per la ricerca",
|
||||
"similarity_threshold": "Soglia di similarità",
|
||||
"similarity_threshold_description": "Punteggio minimo di similarità (0-1) per le note da includere nel contesto per le query LLM",
|
||||
"reprocess_index": "Ricostruisci l'indice di ricerca",
|
||||
"reprocessing_index": "Ricostruzione...",
|
||||
"reprocess_index_started": "Ottimizzazione dell'indice di ricerca avviata in background",
|
||||
"reprocess_index_error": "Errore durante la ricostruzione dell'indice di ricerca",
|
||||
"index_rebuild_progress": "Progresso nella ricostruzione dell'indice",
|
||||
"index_rebuilding": "Indice di ottimizzazione ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Ottimizzazione dell'indice completata",
|
||||
"index_rebuild_status_error": "Errore durante il controllo dello stato di ricostruzione dell'indice",
|
||||
"never": "Mai",
|
||||
"processing": "Elaborazione ({{percentage}}%)",
|
||||
"incomplete": "Incompleto ({{percentage}}%)",
|
||||
"complete": "Completato (100%)",
|
||||
"refreshing": "Rinfrescante...",
|
||||
"auto_refresh_notice": "Si aggiorna automaticamente ogni {{seconds}} secondi",
|
||||
"note_queued_for_retry": "Nota in coda per un nuovo tentativo",
|
||||
"failed_to_retry_note": "Impossibile riprovare nota",
|
||||
"all_notes_queued_for_retry": "Tutte le note non riuscite sono in coda per un nuovo tentativo",
|
||||
"failed_to_retry_all": "Impossibile riprovare le note",
|
||||
"ai_settings": "Impostazioni AI",
|
||||
"api_key_tooltip": "Chiave API per accedere al servizio",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "La chiave API di Anthropic è vuota. Inserisci una chiave API valida.",
|
||||
"openai": "La chiave API di OpenAI è vuota. Inserisci una chiave API valida.",
|
||||
"voyage": "La chiave API di Voyage è vuota. Inserisci una chiave API valida.",
|
||||
"ollama": "La chiave API di Ollama è vuota. Inserisci una chiave API valida."
|
||||
},
|
||||
"agent": {
|
||||
"processing": "Elaborazione in corso...",
|
||||
"thinking": "Pensiero...",
|
||||
"loading": "Caricamento...",
|
||||
"generating": "Generazione in corso..."
|
||||
},
|
||||
"name": "intelligenza artificiale",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Utilizzare il contesto avanzato",
|
||||
"enhanced_context_description": "Fornisce all'IA più contesto dalla nota e dalle note correlate per risposte migliori",
|
||||
"show_thinking": "Mostra il pensiero",
|
||||
"show_thinking_description": "Mostra la catena del processo di pensiero dell'IA",
|
||||
"enter_message": "Inserisci il tuo messaggio...",
|
||||
"error_contacting_provider": "Errore durante la connessione al fornitore dell'IA. Controlla le impostazioni e la connessione Internet.",
|
||||
"error_generating_response": "Errore durante la generazione della risposta AI",
|
||||
"index_all_notes": "Indice Tutte le note",
|
||||
"index_status": "Stato dell'indice",
|
||||
"indexed_notes": "Note indicizzate",
|
||||
"indexing_stopped": "Indicizzazione interrotta",
|
||||
"indexing_in_progress": "Indicizzazione in corso...",
|
||||
"last_indexed": "Ultimo indicizzato",
|
||||
"note_chat": "Nota Chat",
|
||||
"sources": "Fonti",
|
||||
"start_indexing": "Avvia l'indicizzazione",
|
||||
"use_advanced_context": "Usa contesto avanzato",
|
||||
"ollama_no_url": "Ollama non è configurato. Inserisci un URL valido.",
|
||||
"chat": {
|
||||
"root_note_title": "Chat AI",
|
||||
"root_note_content": "Questa nota contiene le conversazioni della chat AI salvate.",
|
||||
"new_chat_title": "Nuova chat",
|
||||
"create_new_ai_chat": "Crea una nuova chat AI"
|
||||
},
|
||||
"create_new_ai_chat": "Crea una nuova chat AI",
|
||||
"configuration_warnings": "Ci sono alcuni problemi con la configurazione dell'IA. Controlla le impostazioni.",
|
||||
"experimental_warning": "La funzionalità LLM è attualmente sperimentale: sei stato avvisato.",
|
||||
"selected_provider": "Fornitore selezionato",
|
||||
"selected_provider_description": "Scegli il fornitore di intelligenza artificiale per le funzionalità di chat e completamento",
|
||||
"select_model": "Seleziona il modello...",
|
||||
"select_provider": "Seleziona il fornitore...",
|
||||
"ai_enabled": "Funzionalità AI abilitate",
|
||||
"ai_disabled": "Funzionalità AI disabilitate",
|
||||
"no_models_found_online": "Nessun modello trovato. Controlla la tua chiave API e le impostazioni.",
|
||||
"no_models_found_ollama": "Nessun modello Ollama trovato. Controlla se Ollama è in esecuzione.",
|
||||
"error_fetching": "Errore durante il recupero dei modelli: {{error}}"
|
||||
},
|
||||
"import": {
|
||||
"importIntoNote": "Importa nella nota",
|
||||
"chooseImportFile": "Scegli file di importazione",
|
||||
@@ -1856,7 +1713,6 @@
|
||||
"confirm-change": "Si sconsiglia di cambiare tipo di nota quando il contenuto della nota non è vuoto. Vuoi continuare comunque?",
|
||||
"geo-map": "Mappa geografica",
|
||||
"beta-feature": "Beta",
|
||||
"ai-chat": "Chat AI",
|
||||
"task-list": "Elenco delle attività",
|
||||
"new-feature": "Nuovo",
|
||||
"collections": "Collezioni"
|
||||
|
||||
@@ -597,7 +597,6 @@
|
||||
"widget": "ウィジェット",
|
||||
"confirm-change": "ノートの内容が空ではない場合、ノートタイプを変更することは推奨されません。続行しますか?",
|
||||
"beta-feature": "Beta",
|
||||
"ai-chat": "AI チャット",
|
||||
"task-list": "タスクリスト",
|
||||
"new-feature": "New",
|
||||
"collections": "コレクション"
|
||||
@@ -1425,149 +1424,6 @@
|
||||
"content_renderer": {
|
||||
"open_externally": "外部で開く"
|
||||
},
|
||||
"ai_llm": {
|
||||
"title": "AI 設定",
|
||||
"enable_ai_features": "AI/LLM 機能を有効化",
|
||||
"enable_ai_description": "ノートの要約、コンテンツ生成、その他のLLM機能などのAI機能を有効にする",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "AI/LLM 機能を有効化",
|
||||
"enable_ai_desc": "ノートの要約、コンテンツ生成、その他のLLM機能などのAI機能を有効にする",
|
||||
"provider_configuration": "AI プロバイダーの設定",
|
||||
"provider_precedence": "プロバイダーの優先順位",
|
||||
"provider_precedence_description": "カンマで区切られたプロバイダーの優先順位リスト(例: 'openai,anthropic,ollama')",
|
||||
"temperature_description": "応答のランダム性を制御する(0 = 決定的、2 = 最大ランダム性)",
|
||||
"system_prompt_description": "すべてのAIとの対話に使用されるデフォルトのシステムプロンプト",
|
||||
"system_prompt": "システムプロンプト",
|
||||
"openai_configuration": "OpenAIの設定",
|
||||
"openai_settings": "OpenAIの設定",
|
||||
"api_key": "APIキー",
|
||||
"model": "モデル",
|
||||
"openai_api_key_description": "OpenAIのAIサービスにアクセスするためのAPIキー",
|
||||
"anthropic_api_key_description": "AnthropicのClaudeモデルにアクセスするためのAPIキー",
|
||||
"default_model": "デフォルトモデル",
|
||||
"openai_model_description": "例: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"openai_url_description": "デフォルト: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Anthropicの設定",
|
||||
"anthropic_model_description": "チャット補完用のAnthropic Claudeモデル",
|
||||
"voyage_settings": "Voyage AIの設定",
|
||||
"ollama_settings": "Ollamaの設定",
|
||||
"ollama_url_description": "Ollama API の URL(デフォルト: http://localhost:11434)",
|
||||
"anthropic_url_description": "Anthropic APIのベースURL(デフォルト: https://api.anthropic.com)",
|
||||
"ollama_model_description": "チャット補完用のOllamaモデル",
|
||||
"anthropic_configuration": "Anthropicの設定",
|
||||
"voyage_configuration": "Voyage AIの設定",
|
||||
"voyage_url_description": "デフォルト: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Ollamaの設定",
|
||||
"enable_ollama": "Ollamaを有効",
|
||||
"enable_ollama_description": "ローカルAIモデルを利用するためOllamaを有効にする",
|
||||
"ollama_url": "Ollama URL",
|
||||
"ollama_model": "Ollamaモデル",
|
||||
"refresh_models": "モデルを更新",
|
||||
"refreshing_models": "更新中...",
|
||||
"error": "エラー",
|
||||
"retry": "再試行",
|
||||
"partial": "{{ percentage }}%完了",
|
||||
"processing": "処理中({{percentage}}%)",
|
||||
"complete": "完了(100%)",
|
||||
"refreshing": "更新中...",
|
||||
"auto_refresh_notice": "{{seconds}}秒ごとに自動更新",
|
||||
"ai_settings": "AI 設定",
|
||||
"api_key_tooltip": "サービスにアクセスするためのAPIキー",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "Anthropic APIキーが空です。有効な APIキーを入力してください。",
|
||||
"openai": "OpenAI APIキーが空です。有効なAPIキーを入力してください。",
|
||||
"voyage": "Voyage APIキーが空です。有効なAPIキーを入力してください。",
|
||||
"ollama": "Ollama APIキーが空です。有効なAPIキーを入力してください。"
|
||||
},
|
||||
"agent": {
|
||||
"processing": "処理中...",
|
||||
"loading": "読み込み中...",
|
||||
"generating": "生成中...",
|
||||
"thinking": "考え中..."
|
||||
},
|
||||
"name": "AI",
|
||||
"openai": "OpenAI",
|
||||
"error_contacting_provider": "AIプロバイダーへの接続中にエラーが発生しました。設定とインターネット接続をご確認ください。",
|
||||
"ollama_no_url": "Ollamaは設定されていません。有効なURLを入力してください。",
|
||||
"chat": {
|
||||
"root_note_title": "AIチャット",
|
||||
"root_note_content": "このノートには、保存されたAIチャットの会話が含まれています。",
|
||||
"new_chat_title": "新しいチャット",
|
||||
"create_new_ai_chat": "新しいAIチャットを作成"
|
||||
},
|
||||
"create_new_ai_chat": "新しいAIチャットを作成",
|
||||
"configuration_warnings": "AIの設定に問題があります。設定を確認してください。",
|
||||
"experimental_warning": "LLM機能は現在実験的です - ご注意ください。",
|
||||
"selected_provider_description": "チャットおよび補完機能のAIプロバイダーを選択する",
|
||||
"selected_provider": "プロバイダーを選択",
|
||||
"select_model": "モデルを選択...",
|
||||
"select_provider": "プロバイダーを選択...",
|
||||
"not_started": "開始されていません",
|
||||
"processed_notes": "処理済みノート",
|
||||
"total_notes": "ノートの総数",
|
||||
"progress": "進行状況",
|
||||
"queued_notes": "キューに登録されたノート",
|
||||
"failed_notes": "失敗したノート",
|
||||
"last_processed": "最終処理日時",
|
||||
"refresh_stats": "統計情報を更新",
|
||||
"temperature": "Temperature(温度)",
|
||||
"url": "ベースURL",
|
||||
"base_url": "ベースURL",
|
||||
"enable_automatic_indexing": "自動インデックス作成を有効にする",
|
||||
"rebuild_index": "インデックスの再構築",
|
||||
"rebuild_index_error": "インデックスの再構築開始時にエラーが発生しました。詳細はログをご確認ください。",
|
||||
"note_title": "ノートのタイトル",
|
||||
"last_attempt": "最終試行日時",
|
||||
"actions": "アクション",
|
||||
"retry_queued": "ノートが再試行キューに追加されました",
|
||||
"retry_failed": "ノートを再試行キューに追加できませんでした",
|
||||
"max_notes_per_llm_query": "クエリあたりの最大ノート数",
|
||||
"max_notes_per_llm_query_description": "AIコンテキストに含める類似ノートの最大数",
|
||||
"active_providers": "アクティブなプロバイダー",
|
||||
"disabled_providers": "無効なプロバイダー",
|
||||
"remove_provider": "検索からプロバイダーを削除",
|
||||
"restore_provider": "検索にプロバイダーを復元",
|
||||
"similarity_threshold": "類似度のしきい値",
|
||||
"similarity_threshold_description": "LLMクエリのコンテキストに含めるノートの最小類似度スコア(0~1)",
|
||||
"reprocess_index": "検索インデックスを再構築",
|
||||
"reprocessing_index": "再構築中...",
|
||||
"reprocess_index_started": "検索インデックスの最適化がバックグラウンドで開始されました",
|
||||
"reprocess_index_error": "検索インデックスの再構築中にエラーが発生しました",
|
||||
"index_rebuild_progress": "インデックスの再構築の進行状況",
|
||||
"index_rebuilding": "インデックスの最適化中({{percentage}}%)",
|
||||
"index_rebuild_complete": "インデックスの最適化が完了しました",
|
||||
"index_rebuild_status_error": "インデックスの再構築ステータスの確認中にエラーが発生しました",
|
||||
"never": "なし",
|
||||
"incomplete": "未完了 ({{percentage}}%)",
|
||||
"note_queued_for_retry": "ノートが再試行キューに追加されました",
|
||||
"failed_to_retry_note": "ノートの再試行に失敗しました",
|
||||
"all_notes_queued_for_retry": "失敗したすべてのノートは再試行のためにキューに入れられました",
|
||||
"failed_to_retry_all": "ノートの再試行に失敗しました",
|
||||
"use_enhanced_context": "拡張されたコンテキストを使用する",
|
||||
"enhanced_context_description": "ノートとその関連ノートからより多くのコンテキストをAIに提供し、より良い応答を実現します",
|
||||
"show_thinking": "思考を表示",
|
||||
"show_thinking_description": "AIの思考プロセスをチェーン表示",
|
||||
"enter_message": "メッセージを入力...",
|
||||
"error_generating_response": "AI応答の生成中にエラーが発生しました",
|
||||
"index_all_notes": "すべてのノートをインデックスに登録",
|
||||
"index_status": "インデックスのステータス",
|
||||
"indexed_notes": "インデックス登録済みのノート",
|
||||
"indexing_stopped": "インデックス登録を停止しました",
|
||||
"indexing_in_progress": "インデックス登録中です...",
|
||||
"last_indexed": "最終インデックス作成日時",
|
||||
"note_chat": "ノートチャット",
|
||||
"sources": "ソース",
|
||||
"start_indexing": "インデックス作成を開始",
|
||||
"use_advanced_context": "高度なコンテキストを使用",
|
||||
"ai_enabled": "AI 機能が有効",
|
||||
"ai_disabled": "AI 機能が無効",
|
||||
"no_models_found_online": "モデルが見つかりません。API キーと設定を確認してください。",
|
||||
"no_models_found_ollama": "Ollama モデルが見つかりません。Ollama が実行中かどうかを確認してください。",
|
||||
"error_fetching": "モデルの取得エラー: {{error}}"
|
||||
},
|
||||
"add_label": {
|
||||
"add_label": "ラベルを追加",
|
||||
"label_name_placeholder": "ラベル名",
|
||||
|
||||
@@ -773,149 +773,6 @@
|
||||
"target_note": "notatka docelowa",
|
||||
"create_relation_on_all_matched_notes": "Na wszystkich dopasowanych notatkach utwórz podaną relację."
|
||||
},
|
||||
"ai_llm": {
|
||||
"actions": "Akcje",
|
||||
"retry": "Ponów",
|
||||
"partial": "{{ percentage }}% ukończono",
|
||||
"retry_queued": "Notatka zakolejkowana do ponowienia",
|
||||
"retry_failed": "Nie udało się zakolejkować notatki do ponowienia",
|
||||
"max_notes_per_llm_query": "Maks. notatek na zapytanie",
|
||||
"index_all_notes": "Indeksuj wszystkie notatki",
|
||||
"index_status": "Status indeksu",
|
||||
"indexed_notes": "Zaindeksowane notatki",
|
||||
"indexing_stopped": "Indeksowanie zatrzymane",
|
||||
"indexing_in_progress": "Indeksowanie w toku...",
|
||||
"last_indexed": "Ostatnio zaindeksowane",
|
||||
"note_chat": "Czat notatki",
|
||||
"note_title": "Tytuł notatki",
|
||||
"error": "Błąd",
|
||||
"last_attempt": "Ostatnia próba",
|
||||
"queued_notes": "Notatki w kolejce",
|
||||
"failed_notes": "Notatki nieudane",
|
||||
"last_processed": "Ostatnio przetworzone",
|
||||
"refresh_stats": "Odśwież statystyki",
|
||||
"enable_ai_features": "Włącz funkcje AI/LLM",
|
||||
"enable_ai_description": "Włącz funkcje AI, takie jak podsumowywanie notatek, generowanie treści i inne możliwości LLM",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Włącz funkcje AI/LLM",
|
||||
"enable_ai_desc": "Włącz funkcje AI, takie jak podsumowywanie notatek, generowanie treści i inne możliwości LLM",
|
||||
"provider_configuration": "Konfiguracja dostawcy AI",
|
||||
"provider_precedence": "Kolejność dostawców",
|
||||
"provider_precedence_description": "Lista dostawców oddzielona przecinkami w kolejności pierwszeństwa (np. 'openai,anthropic,ollama')",
|
||||
"temperature": "Temperatura",
|
||||
"temperature_description": "Kontroluje losowość w odpowiedziach (0 = deterministyczne, 2 = maksymalna losowość)",
|
||||
"system_prompt": "Prompt systemowy",
|
||||
"system_prompt_description": "Domyślny prompt systemowy używany dla wszystkich interakcji AI",
|
||||
"openai_configuration": "Konfiguracja OpenAI",
|
||||
"openai_settings": "Ustawienia OpenAI",
|
||||
"api_key": "Klucz API",
|
||||
"url": "Bazowy URL",
|
||||
"model": "Model",
|
||||
"openai_api_key_description": "Twój klucz API OpenAI do dostępu do ich usług AI",
|
||||
"anthropic_api_key_description": "Twój klucz API Anthropic do dostępu do modeli Claude",
|
||||
"default_model": "Domyślny model",
|
||||
"openai_model_description": "Przykłady: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "Bazowy URL",
|
||||
"openai_url_description": "Domyślnie: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Ustawienia Anthropic",
|
||||
"anthropic_url_description": "Bazowy URL dla API Anthropic (domyślnie: https://api.anthropic.com)",
|
||||
"anthropic_model_description": "Modele Anthropic Claude do czatu",
|
||||
"voyage_settings": "Ustawienia Voyage AI",
|
||||
"ollama_settings": "Ustawienia Ollama",
|
||||
"ollama_url_description": "URL dla API Ollama (domyślnie: http://localhost:11434)",
|
||||
"ollama_model_description": "Model Ollama do użycia w czacie",
|
||||
"anthropic_configuration": "Konfiguracja Anthropic",
|
||||
"voyage_configuration": "Konfiguracja Voyage AI",
|
||||
"voyage_url_description": "Domyślnie: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Konfiguracja Ollama",
|
||||
"enable_ollama": "Włącz Ollama",
|
||||
"enable_ollama_description": "Włącz Ollama do lokalnego użycia modeli AI",
|
||||
"ollama_url": "URL Ollama",
|
||||
"ollama_model": "Model Ollama",
|
||||
"refresh_models": "Odśwież modele",
|
||||
"refreshing_models": "Odświeżanie...",
|
||||
"enable_automatic_indexing": "Włącz automatyczne indeksowanie",
|
||||
"rebuild_index": "Przebuduj indeks",
|
||||
"rebuild_index_error": "Błąd podczas rozpoczynania przebudowy indeksu. Sprawdź logi po szczegóły.",
|
||||
"max_notes_per_llm_query_description": "Maksymalna liczba podobnych notatek do uwzględnienia w kontekście AI",
|
||||
"active_providers": "Aktywni dostawcy",
|
||||
"disabled_providers": "Wyłączeni dostawcy",
|
||||
"remove_provider": "Usuń dostawcę z wyszukiwania",
|
||||
"restore_provider": "Przywróć dostawcę do wyszukiwania",
|
||||
"similarity_threshold": "Próg podobieństwa",
|
||||
"not_started": "Nie rozpoczęto",
|
||||
"title": "Ustawienia AI",
|
||||
"processed_notes": "Przetworzone notatki",
|
||||
"total_notes": "Łącznie notatek",
|
||||
"progress": "Postęp",
|
||||
"similarity_threshold_description": "Minimalny wynik podobieństwa (0-1) dla notatek, które mają być uwzględnione w kontekście zapytań LLM",
|
||||
"reprocess_index": "Przebuduj indeks wyszukiwania",
|
||||
"reprocessing_index": "Przebudowywanie...",
|
||||
"reprocess_index_started": "Optymalizacja indeksu wyszukiwania rozpoczęta w tle",
|
||||
"reprocess_index_error": "Błąd podczas przebudowy indeksu wyszukiwania",
|
||||
"index_rebuild_progress": "Postęp przebudowy indeksu",
|
||||
"index_rebuilding": "Optymalizacja indeksu ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Optymalizacja indeksu zakończona",
|
||||
"index_rebuild_status_error": "Błąd podczas sprawdzania statusu przebudowy indeksu",
|
||||
"never": "Nigdy",
|
||||
"processing": "Przetwarzanie ({{percentage}}%)",
|
||||
"incomplete": "Niekompletne ({{percentage}}%)",
|
||||
"complete": "Zakończone (100%)",
|
||||
"refreshing": "Odświeżanie...",
|
||||
"auto_refresh_notice": "Automatyczne odświeżanie co {{seconds}} sekund",
|
||||
"note_queued_for_retry": "Notatka zakolejkowana do ponowienia",
|
||||
"failed_to_retry_note": "Nie udało się ponowić notatki",
|
||||
"all_notes_queued_for_retry": "Wszystkie nieudane notatki zakolejkowane do ponowienia",
|
||||
"failed_to_retry_all": "Nie udało się ponowić notatek",
|
||||
"ai_settings": "Ustawienia AI",
|
||||
"api_key_tooltip": "Klucz API do dostępu do usługi",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "Klucz API Anthropic jest pusty. Proszę wprowadzić poprawny klucz API.",
|
||||
"openai": "Klucz API OpenAI jest pusty. Proszę wprowadzić poprawny klucz API.",
|
||||
"voyage": "Klucz API Voyage jest pusty. Proszę wprowadzić poprawny klucz API.",
|
||||
"ollama": "Klucz API Ollama jest pusty. Proszę wprowadzić poprawny klucz API."
|
||||
},
|
||||
"agent": {
|
||||
"processing": "Przetwarzanie...",
|
||||
"thinking": "Myślę...",
|
||||
"loading": "Ładowanie...",
|
||||
"generating": "Generowanie..."
|
||||
},
|
||||
"name": "AI",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Użyj rozszerzonego kontekstu",
|
||||
"enhanced_context_description": "Dostarcza AI więcej kontekstu z notatki i jej powiązanych notatek dla lepszych odpowiedzi",
|
||||
"show_thinking": "Pokaż proces myślenia",
|
||||
"show_thinking_description": "Pokaż ciąg myślowy AI",
|
||||
"enter_message": "Wpisz swoją wiadomość...",
|
||||
"error_contacting_provider": "Błąd połączenia z dostawcą AI. Sprawdź swoje ustawienia i połączenie internetowe.",
|
||||
"error_generating_response": "Błąd generowania odpowiedzi AI",
|
||||
"sources": "Źródła",
|
||||
"start_indexing": "Rozpocznij indeksowanie",
|
||||
"use_advanced_context": "Użyj zaawansowanego kontekstu",
|
||||
"ollama_no_url": "Ollama nie jest skonfigurowana. Proszę wprowadzić poprawny URL.",
|
||||
"chat": {
|
||||
"root_note_title": "Czaty AI",
|
||||
"root_note_content": "Ta notatka zawiera twoje zapisane rozmowy czatu AI.",
|
||||
"new_chat_title": "Nowy czat",
|
||||
"create_new_ai_chat": "Utwórz nowy czat AI"
|
||||
},
|
||||
"create_new_ai_chat": "Utwórz nowy czat AI",
|
||||
"configuration_warnings": "Istnieją pewne problemy z twoją konfiguracją AI. Proszę sprawdzić ustawienia.",
|
||||
"experimental_warning": "Funkcja LLM jest obecnie eksperymentalna - zostałeś ostrzeżony.",
|
||||
"selected_provider": "Wybrany dostawca",
|
||||
"selected_provider_description": "Wybierz dostawcę AI dla funkcji czatu i uzupełniania",
|
||||
"select_model": "Wybierz model...",
|
||||
"select_provider": "Wybierz dostawcę...",
|
||||
"ai_enabled": "Funkcje AI włączone",
|
||||
"ai_disabled": "Funkcje AI wyłączone",
|
||||
"no_models_found_online": "Nie znaleziono modeli. Proszę sprawdzić klucz API i ustawienia.",
|
||||
"no_models_found_ollama": "Nie znaleziono modeli Ollama. Proszę sprawdzić, czy Ollama jest uruchomiona.",
|
||||
"error_fetching": "Błąd pobierania modeli: {{error}}"
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Monit",
|
||||
"ok": "OK",
|
||||
|
||||
@@ -1179,149 +1179,6 @@
|
||||
"enable-smooth-scroll": "Activar deslocamento suave",
|
||||
"app-restart-required": "(é necessário reiniciar a aplicação para aplicar as alterações)"
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "Não iniciado",
|
||||
"title": "Configurações de IA",
|
||||
"processed_notes": "Notas Processadas",
|
||||
"total_notes": "Total de Notas",
|
||||
"progress": "Andamento",
|
||||
"queued_notes": "Notas Enfileiradas",
|
||||
"failed_notes": "Notas com Falha",
|
||||
"last_processed": "Últimas Processadas",
|
||||
"refresh_stats": "Atualizar Estatísticas",
|
||||
"enable_ai_features": "Ativar recurso IA/LLM",
|
||||
"enable_ai_description": "Ativar recursos IA como sumarização de notas, geração de conteúdo e outras capacidades de LLM",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Ativar recursos IA/LLM",
|
||||
"enable_ai_desc": "Ativar recursos de IA como sumarização de notas, geração de conteúdo e outras capacidades de LLM",
|
||||
"provider_configuration": "Configuração de Provedor de IA",
|
||||
"provider_precedence": "Prioridade de provedor",
|
||||
"provider_precedence_description": "Lista de provedores em ordem de prioridade, separados por vírgula (por exemplo, 'openai, anthropic, ollama')",
|
||||
"temperature": "Temperatura",
|
||||
"temperature_description": "Controla a aleatoriedade em respostas (0 = determinística, 2 = aleatoriedade máxima)",
|
||||
"system_prompt": "Prompt de Sistema",
|
||||
"system_prompt_description": "Prompt padrão de sistema usado para todas as interações de IA",
|
||||
"openai_configuration": "Configuração OpenAI",
|
||||
"openai_settings": "Opções OpenAI",
|
||||
"api_key": "Chave de API",
|
||||
"url": "URL Base",
|
||||
"model": "Modelo",
|
||||
"openai_api_key_description": "A sua API Key da OpenAI para aceder os serviços de IA",
|
||||
"anthropic_api_key_description": "A sua API Key da Anthropic para aceder os modelos Claude",
|
||||
"default_model": "Modelo Padrão",
|
||||
"openai_model_description": "Exemplos: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "URL Base",
|
||||
"openai_url_description": "Padrão: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Configurações Anthropic",
|
||||
"anthropic_url_description": "URL Base da API Anthropic (padrão: https://api.anthropic.com)",
|
||||
"anthropic_model_description": "Modelos Claude da Anthropic para completar conversas",
|
||||
"voyage_settings": "Configurações Voyage AI",
|
||||
"ollama_settings": "Configurações do Ollama",
|
||||
"ollama_url_description": "URL para a API Ollama (padrão: http://localhost:11434)",
|
||||
"ollama_model_description": "Modelo Ollama usado para complementação de chat",
|
||||
"anthropic_configuration": "Configuração da Anthropic",
|
||||
"voyage_configuration": "Configuração da Voyage IA",
|
||||
"voyage_url_description": "Padrão: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Configuração da Ollama",
|
||||
"enable_ollama": "Ativar Ollama",
|
||||
"enable_ollama_description": "Ativar Ollama para uso do modelo local de IA",
|
||||
"ollama_url": "URL da Ollama",
|
||||
"ollama_model": "Modelo do Ollama",
|
||||
"refresh_models": "Atualizar Modelos",
|
||||
"refreshing_models": "A atualizar…",
|
||||
"enable_automatic_indexing": "Ativar indexação automática",
|
||||
"rebuild_index": "Reconstruir Índice",
|
||||
"rebuild_index_error": "Ocorreu um erro ao iniciar a reconstrução do índice. Verifique os logs para obter pormenores.",
|
||||
"note_title": "Título da nota",
|
||||
"error": "Erro",
|
||||
"last_attempt": "Última Tentativa",
|
||||
"actions": "Ações",
|
||||
"retry": "Tentar novamente",
|
||||
"partial": "{{ percentage }}% concluído",
|
||||
"retry_queued": "Nota enfileirada para nova tentativa",
|
||||
"retry_failed": "Falha ao enfileirar nota para nova tentativa",
|
||||
"max_notes_per_llm_query": "Máximo de Notas por Consulta",
|
||||
"max_notes_per_llm_query_description": "Quantidade máxima de notas similares para incluir no contexto da IA",
|
||||
"active_providers": "Provedores Ativos",
|
||||
"disabled_providers": "Provedores Desativados",
|
||||
"remove_provider": "Remover provedor da pesquisa",
|
||||
"restore_provider": "Restaurar provedor na pesquisa",
|
||||
"similarity_threshold": "Tolerância de Similaridade",
|
||||
"similarity_threshold_description": "Pontuação máxima de similaridade (0-1) para notas a serem incluídas no contexto das consultas de LLM",
|
||||
"reprocess_index": "Reconstruir Índice de Pesquisa",
|
||||
"reprocessing_index": "A reconstruir…",
|
||||
"reprocess_index_started": "Otimiação do índice de pesquisa iniciado em plano de fundo",
|
||||
"reprocess_index_error": "Erro ao reconstruir índice de pesquisa",
|
||||
"index_rebuild_progress": "Andamento da Reconstrução do Índice",
|
||||
"index_rebuilding": "A otimizar índice ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Otimização de índice finalizada",
|
||||
"index_rebuild_status_error": "Erro ao verificar o estado da reconstrução do índice",
|
||||
"never": "Nunca",
|
||||
"processing": "A processar ({{percentage}}%)",
|
||||
"incomplete": "Incompleto ({{percentage}}%)",
|
||||
"complete": "Completo (100%)",
|
||||
"refreshing": "A atualizar…",
|
||||
"auto_refresh_notice": "A atualizar automaticamente a cada {{seconds}} segundos",
|
||||
"note_queued_for_retry": "Nota enfileirada para nova tentativa",
|
||||
"failed_to_retry_note": "Falha ao retentar nota",
|
||||
"all_notes_queued_for_retry": "Todas as notas com falha enfileiradas para nova tentativa",
|
||||
"failed_to_retry_all": "Falha ao retentar notas",
|
||||
"ai_settings": "Configurações IA",
|
||||
"api_key_tooltip": "Chave de API para aceder o serviço",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "A chave de API Anthropic está vazia. Por favor, digite uma chave de API válida.",
|
||||
"openai": "A chave de API OpenAI está vazia. Por favor, digite uma chave de API válida.",
|
||||
"voyage": "A chave de API da Voyage API está vazia. Por favor, digite uma chave de API válida.",
|
||||
"ollama": "A chave de API da Ollama API está vazia. Por favor, digite uma chave de API válida."
|
||||
},
|
||||
"agent": {
|
||||
"processing": "A processar…",
|
||||
"thinking": "A pensar…",
|
||||
"loading": "A carregar…",
|
||||
"generating": "A gerir…"
|
||||
},
|
||||
"name": "IA",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Usar contexto aprimorado",
|
||||
"enhanced_context_description": "Alimentar IA com mais contexto sobre a nota e as suas notas relacionadas para melhores respostas",
|
||||
"show_thinking": "Exibir pensamento",
|
||||
"show_thinking_description": "Exibir o processo de linha de raciocínio da AI",
|
||||
"enter_message": "Digite a sua mensagem…",
|
||||
"error_contacting_provider": "Erro ao contactar o provedor de IA. Por favor, verifique as suas configurações e a sua conexão à internet.",
|
||||
"error_generating_response": "Erro ao gerar resposta da IA",
|
||||
"index_all_notes": "Indexar Todas as Notas",
|
||||
"index_status": "Estado do Índice",
|
||||
"indexed_notes": "Notas Indexadas",
|
||||
"indexing_stopped": "Indexação interrompida",
|
||||
"indexing_in_progress": "Indexação em andamento…",
|
||||
"last_indexed": "Última Indexada",
|
||||
"note_chat": "Conversa de Nota",
|
||||
"sources": "Origens",
|
||||
"start_indexing": "Iniciar Indexação",
|
||||
"use_advanced_context": "Usar Contexto Avançado",
|
||||
"ollama_no_url": "Ollama não está configurado. Por favor, digite uma URL válida.",
|
||||
"chat": {
|
||||
"root_note_title": "Conversas IA",
|
||||
"root_note_content": "Esta nota contém as suas conversas com IA gravdas.",
|
||||
"new_chat_title": "Nova Conversa",
|
||||
"create_new_ai_chat": "Criar Conversa IA"
|
||||
},
|
||||
"create_new_ai_chat": "Criar Conversa IA",
|
||||
"configuration_warnings": "Há problemas com a sua configuração de IA. Por favor, verifique as suas configurações.",
|
||||
"experimental_warning": "O recurso de LLM atualmente é experimental - você foi avisado.",
|
||||
"selected_provider": "Provedor Selecionado",
|
||||
"selected_provider_description": "Escolha o provedor de IA para conversas e recursos de completar",
|
||||
"select_model": "Selecionar modelo…",
|
||||
"select_provider": "Selecionar provedor…",
|
||||
"ai_enabled": "Recursos de IA ativados",
|
||||
"ai_disabled": "Recursos de IA desativados",
|
||||
"no_models_found_online": "Nenhum modelo encontrado. Por favor, verifique a sua chave de API e as configurações.",
|
||||
"no_models_found_ollama": "Nenhum modelo Ollama encontrado. Por favor, verifique se o Ollama está em execução.",
|
||||
"error_fetching": "Erro ao obter modelos: {{error}}"
|
||||
},
|
||||
"zoom_factor": {
|
||||
"title": "Fator do Zoom (apenas versão de área de trabalho)",
|
||||
"description": "O zoom também pode ser controlado com atalhos CTRL+- e CTRL+=."
|
||||
@@ -1691,7 +1548,6 @@
|
||||
"confirm-change": "Não é recomentado alterar o tipo da nota quando o conteúdo da nota não está vazio. Quer continuar assim mesmo?",
|
||||
"geo-map": "Mapa geográfico",
|
||||
"beta-feature": "Beta",
|
||||
"ai-chat": "Chat IA",
|
||||
"task-list": "Lista de Tarefas",
|
||||
"new-feature": "Novo",
|
||||
"collections": "Coleções"
|
||||
|
||||
@@ -85,149 +85,6 @@
|
||||
"clone_to_selected_note": "Clonar para a nota selecionada",
|
||||
"note_cloned": "A nota \"{{clonedTitle}}\" foi clonada para \"{{targetTitle}}\""
|
||||
},
|
||||
"ai_llm": {
|
||||
"temperature": "Temperatura",
|
||||
"retry_queued": "Nota enfileirada para nova tentativa",
|
||||
"queued_notes": "Notas Enfileiradas",
|
||||
"empty_key_warning": {
|
||||
"voyage": "A chave de API da Voyage API está vazia. Por favor, digite uma chave de API válida.",
|
||||
"ollama": "A chave de API da Ollama API está vazia. Por favor, digite uma chave de API válida.",
|
||||
"anthropic": "A chave de API Anthropic está vazia. Por favor, digite uma chave de API válida.",
|
||||
"openai": "A chave de API OpenAI está vazia. Por favor, digite uma chave de API válida."
|
||||
},
|
||||
"not_started": "Não iniciado",
|
||||
"title": "Configurações de IA",
|
||||
"processed_notes": "Notas Processadas",
|
||||
"total_notes": "Total de Notas",
|
||||
"progress": "Andamento",
|
||||
"failed_notes": "Notas com Falha",
|
||||
"last_processed": "Últimas Processadas",
|
||||
"refresh_stats": "Atualizar Estatísticas",
|
||||
"enable_ai_features": "Ativar recurso IA/LLM",
|
||||
"enable_ai_description": "Ativar recursos IA como sumarização de notas, geração de conteúdo, e outras capacidades de LLM",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"enable_ai": "Ativar recursos IA/LLM",
|
||||
"provider_configuration": "Configuração de Provedor de IA",
|
||||
"system_prompt": "Prompt de Sistema",
|
||||
"system_prompt_description": "Prompt padrão de sistema usado para todas as interações de IA",
|
||||
"openai_configuration": "Configuração OpenAI",
|
||||
"openai_settings": "Opções OpenAI",
|
||||
"api_key": "Chave de API",
|
||||
"url": "URL Base",
|
||||
"model": "Modelo",
|
||||
"openai_api_key_description": "Sua API Key da OpenAI para acessar os serviços de IA",
|
||||
"anthropic_api_key_description": "Sua API Key da Anthropic para acessar os modelos Claude",
|
||||
"default_model": "Modelo Padrão",
|
||||
"openai_model_description": "Exemplos: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "URL Base",
|
||||
"openai_url_description": "Padrão: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Configurações Anthropic",
|
||||
"anthropic_url_description": "URL Base da API Anthropic (padrão: https://api.anthropic.com)",
|
||||
"anthropic_model_description": "Modelos Claude da Anthropic para completar conversas",
|
||||
"voyage_settings": "Configurações Voyage AI",
|
||||
"retry": "Tentar novamente",
|
||||
"retry_failed": "Falha ao enfileirar nota para nova tentativa",
|
||||
"max_notes_per_llm_query": "Máximo de Notas por Consulta",
|
||||
"max_notes_per_llm_query_description": "Número máximo de notas similares para incluir no contexto da IA",
|
||||
"active_providers": "Provedores Ativos",
|
||||
"disabled_providers": "Provedores Desativados",
|
||||
"remove_provider": "Remover provedor da pesquisa",
|
||||
"restore_provider": "Restaurar provedor na pesquisa",
|
||||
"similarity_threshold": "Tolerância de Similaridade",
|
||||
"similarity_threshold_description": "Pontuação máxima de similaridade (0-1) para notas a serem incluídas no contexto das consultas de LLM",
|
||||
"reprocess_index": "Reconstruir Índice de Pesquisa",
|
||||
"reprocessing_index": "Reconstruindo…",
|
||||
"reprocess_index_started": "Otimiação do índice de pesquisa iniciado em plano de fundo",
|
||||
"reprocess_index_error": "Erro ao reconstruir índice de pesquisa",
|
||||
"index_rebuild_progress": "Andamento da Reconstrução do Índice",
|
||||
"index_rebuilding": "Otimizando índice ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Otimização de índice finalizada",
|
||||
"index_rebuild_status_error": "Erro ao verificar o estado da reconstrução do índice",
|
||||
"never": "Nunca",
|
||||
"processing": "Processando ({{percentage}}%)",
|
||||
"incomplete": "Incompleto ({{percentage}}%)",
|
||||
"complete": "Completo (100%)",
|
||||
"refreshing": "Atualizando…",
|
||||
"auto_refresh_notice": "Atualizando automaticamente a cada {{seconds}} segundos",
|
||||
"note_queued_for_retry": "Nota enfileirada para nova tentativa",
|
||||
"failed_to_retry_note": "Falha ao retentar nota",
|
||||
"all_notes_queued_for_retry": "Todas as notas com falha enfileiradas para nova tentativa",
|
||||
"failed_to_retry_all": "Falha ao retentar notas",
|
||||
"ai_settings": "Configurações IA",
|
||||
"api_key_tooltip": "Chave de API para acessar o serviço",
|
||||
"agent": {
|
||||
"processing": "Processando…",
|
||||
"thinking": "Pensando…",
|
||||
"loading": "Carregando…",
|
||||
"generating": "Gerando…"
|
||||
},
|
||||
"name": "IA",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Usar contexto aprimorado",
|
||||
"enhanced_context_description": "Alimentar IA com mais contexto sobre a nota e suas notas relacionadas para melhores respostas",
|
||||
"show_thinking": "Exibir pensamento",
|
||||
"enter_message": "Digite sua mensagem…",
|
||||
"error_contacting_provider": "Erro ao contatar o provedor de IA. Por favor, verifique suas configurações e sua conexão de internet.",
|
||||
"error_generating_response": "Erro ao gerar resposta da IA",
|
||||
"index_all_notes": "Indexar Todas as Notas",
|
||||
"index_status": "Estado do Índice",
|
||||
"indexed_notes": "Notas Indexadas",
|
||||
"indexing_stopped": "Indexação interrompida",
|
||||
"indexing_in_progress": "Indexação em andamento…",
|
||||
"last_indexed": "Última Indexada",
|
||||
"note_chat": "Conversa de Nota",
|
||||
"sources": "Origens",
|
||||
"start_indexing": "Iniciar Indexação",
|
||||
"use_advanced_context": "Usar Contexto Avançado",
|
||||
"ollama_no_url": "Ollama não está configurado. Por favor, digite uma URL válida.",
|
||||
"chat": {
|
||||
"root_note_title": "Conversas IA",
|
||||
"root_note_content": "Esta nota contém suas conversas com IA salvas.",
|
||||
"new_chat_title": "Nova Conversa",
|
||||
"create_new_ai_chat": "Criar nova Conversa IA"
|
||||
},
|
||||
"create_new_ai_chat": "Criar nova Conversa IA",
|
||||
"configuration_warnings": "Existem alguns problemas com sua configuração de IA. Por fovor, verifique suas configurações.",
|
||||
"experimental_warning": "O recurso de LLM atualmente é experimental - você foi avisado.",
|
||||
"selected_provider": "Provedor Selecionado",
|
||||
"selected_provider_description": "Escolha o provedor de IA para conversas e recursos de completar",
|
||||
"select_model": "Selecionar modelo…",
|
||||
"select_provider": "Selecionar provedor…",
|
||||
"ai_enabled": "Recursos de IA habilitados",
|
||||
"ai_disabled": "Recursos de IA desabilitados",
|
||||
"no_models_found_online": "Nenhum modelo encontrado. Por favor, verifique sua chave de API e as configurações.",
|
||||
"no_models_found_ollama": "Nenhum modelo Ollama encontrado. Por favor, verifique se o Ollama está em execução.",
|
||||
"error_fetching": "Erro ao obter modelos: {{error}}",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai_desc": "Habilitar recursos de IA como sumarização de notas, geração de conteúdo, e outras capacidades de LLM",
|
||||
"provider_precedence": "Prioridade de provedor",
|
||||
"provider_precedence_description": "Lista de provedores em ordem de prioridade, separados por vírgula (por exemplo, 'openai, anthropic, ollama')",
|
||||
"temperature_description": "Controla a aleatoriedade em respostas (0 = determinística, 2 = aleatoriedade máxima)",
|
||||
"ollama_settings": "Configurações do Ollama",
|
||||
"ollama_url_description": "URL para a API Ollama (padrão: http://localhost:11434)",
|
||||
"ollama_model_description": "Modelo Ollama usado para complementação de chat",
|
||||
"anthropic_configuration": "Configuração da Anthropic",
|
||||
"voyage_configuration": "Configuração da Voyage IA",
|
||||
"voyage_url_description": "Padrão: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Configuração da Ollama",
|
||||
"enable_ollama": "Habilitar Ollama",
|
||||
"enable_ollama_description": "Habilitar Ollama para uso do modelo local de IA",
|
||||
"ollama_url": "URL da Ollama",
|
||||
"ollama_model": "Modelo do Ollama",
|
||||
"refresh_models": "Atualizar Modelos",
|
||||
"refreshing_models": "Atualizando…",
|
||||
"enable_automatic_indexing": "Habilitar indexação automática",
|
||||
"rebuild_index": "Reconstruir Índice",
|
||||
"rebuild_index_error": "Ocorreu um erro ao iniciar a reconstrução do índice. Verifique os logs para obter detalhes.",
|
||||
"note_title": "Título da nota",
|
||||
"error": "Erro",
|
||||
"last_attempt": "Última Tentativa",
|
||||
"actions": "Ações",
|
||||
"partial": "{{ percentage }}% concluído",
|
||||
"show_thinking_description": "Exibir o processo de linha de raciocínio da AI"
|
||||
},
|
||||
"confirm": {
|
||||
"confirmation": "Confirmação",
|
||||
"cancel": "Cancelar",
|
||||
@@ -1575,7 +1432,6 @@
|
||||
"confirm-change": "Não é recomentado alterar o tipo da nota quando o conteúdo da nota não está vazio. Quer continuar assim mesmo?",
|
||||
"geo-map": "Mapa geográfico",
|
||||
"beta-feature": "Beta",
|
||||
"ai-chat": "Chat IA",
|
||||
"task-list": "Lista de Tarefas",
|
||||
"new-feature": "Novo",
|
||||
"collections": "Coleções",
|
||||
|
||||
@@ -1457,7 +1457,6 @@
|
||||
"geo-map": "Hartă geografică",
|
||||
"beta-feature": "Beta",
|
||||
"task-list": "Listă de sarcini",
|
||||
"ai-chat": "Discuție cu AI-ul",
|
||||
"new-feature": "Nou",
|
||||
"collections": "Colecții"
|
||||
},
|
||||
@@ -1835,149 +1834,6 @@
|
||||
"lock-editing": "Blochează editarea",
|
||||
"unlock-editing": "Deblochează editarea"
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "Nu s-a pornit",
|
||||
"title": "Setări AI",
|
||||
"processed_notes": "Notițe procesate",
|
||||
"total_notes": "Totalul de notițe",
|
||||
"progress": "Progres",
|
||||
"queued_notes": "Notițe în curs de procesare",
|
||||
"failed_notes": "Notițe ce au eșuat",
|
||||
"last_processed": "Ultima procesare",
|
||||
"refresh_stats": "Reîmprospătare statistici",
|
||||
"enable_ai_features": "Activează funcțiile AI/LLM",
|
||||
"enable_ai_description": "Activează funcțiile AI precum sumarizarea notițelor, generarea de conținut și alte capabilități ale LLM-ului",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Activează funcții AI/LLM",
|
||||
"enable_ai_desc": "Activează funcțiile AI precum sumarizarea notițelor, generarea de conținut și alte capabilități ale LLM-ului",
|
||||
"provider_configuration": "Setările furnizorului de AI",
|
||||
"provider_precedence": "Ordinea de precedență a furnizorilor",
|
||||
"provider_precedence_description": "Lista de furnizori în ordinea de precedență, separate de virgulă (ex. „openai,anthropic,ollama”)",
|
||||
"temperature": "Temperatură",
|
||||
"temperature_description": "Controlează aleatoritatea din răspunsuri (0 = deterministic, 2 = maxim aleator)",
|
||||
"system_prompt": "Prompt-ul de sistem",
|
||||
"system_prompt_description": "Prompt-ul de sistem folosit pentru toate interacțiunile cu AI-ul",
|
||||
"openai_configuration": "Configurația OpenAI",
|
||||
"openai_settings": "Setările OpenAI",
|
||||
"api_key": "Cheie API",
|
||||
"url": "URL de bază",
|
||||
"model": "Model",
|
||||
"openai_api_key_description": "Cheia de API din OpenAI pentru a putea accesa serviciile de AI",
|
||||
"anthropic_api_key_description": "Cheia de API din Anthropic pentru a accesa modelele Claude",
|
||||
"default_model": "Modelul implicit",
|
||||
"openai_model_description": "Exemple: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "URL de bază",
|
||||
"openai_url_description": "Implicit: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Setări Anthropic",
|
||||
"anthropic_url_description": "URL de bază pentru API-ul Anthropic (implicit: https://api.anthropic.com)",
|
||||
"anthropic_model_description": "Modele Anthropic Claude pentru auto-completare",
|
||||
"voyage_settings": "Setări Voyage AI",
|
||||
"ollama_settings": "Setări Ollama",
|
||||
"ollama_url_description": "URL pentru API-ul Ollama (implicit: http://localhost:11434)",
|
||||
"ollama_model_description": "Modelul Ollama pentru auto-completare",
|
||||
"anthropic_configuration": "Configurația Anthropic",
|
||||
"voyage_configuration": "Configurația Voyage AI",
|
||||
"voyage_url_description": "Implicit: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Configurația Ollama",
|
||||
"enable_ollama": "Activează Ollama",
|
||||
"enable_ollama_description": "Activează Ollama pentru a putea utiliza modele AI locale",
|
||||
"ollama_url": "URL Ollama",
|
||||
"ollama_model": "Model Ollama",
|
||||
"refresh_models": "Reîmprospătează modelele",
|
||||
"refreshing_models": "Reîmprospătare...",
|
||||
"enable_automatic_indexing": "Activează indexarea automată",
|
||||
"rebuild_index": "Reconstruire index",
|
||||
"rebuild_index_error": "Eroare la reconstruirea indexului. Verificați logurile pentru mai multe detalii.",
|
||||
"note_title": "Titlul notiței",
|
||||
"error": "Eroare",
|
||||
"last_attempt": "Ultima încercare",
|
||||
"actions": "Acțiuni",
|
||||
"retry": "Reîncercare",
|
||||
"partial": "{{ percentage }}% finalizat",
|
||||
"retry_queued": "Notiță pusă în coadă pentru reîncercare",
|
||||
"retry_failed": "Nu s-a putut pune notița în coada pentru reîncercare",
|
||||
"max_notes_per_llm_query": "Număr maximum de notițe per interogare",
|
||||
"max_notes_per_llm_query_description": "Numărul maxim de notițe similare incluse în contextul pentru AI",
|
||||
"active_providers": "Furnizori activi",
|
||||
"disabled_providers": "Furnizori dezactivați",
|
||||
"remove_provider": "Șterge furnizorul din căutare",
|
||||
"restore_provider": "Restaurează furnizorul pentru căutare",
|
||||
"similarity_threshold": "Prag de similaritate",
|
||||
"similarity_threshold_description": "Scorul minim de similaritate (0-1) pentru a include notițele în contextul interogărilor LLM",
|
||||
"reprocess_index": "Reconstruiește indexul de căutare",
|
||||
"reprocessing_index": "Reconstruire...",
|
||||
"reprocess_index_started": "S-a pornit în fundal optimizarea indexului de căutare",
|
||||
"reprocess_index_error": "Eroare la reconstruirea indexului de căutare",
|
||||
"index_rebuild_progress": "Reconstruire index în curs",
|
||||
"index_rebuilding": "Optimizare index ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Optimizarea indexului a avut loc cu succes",
|
||||
"index_rebuild_status_error": "Eroare la verificarea stării reconstruirii indexului",
|
||||
"never": "Niciodată",
|
||||
"processing": "Procesare ({{percentage}}%)",
|
||||
"incomplete": "Incomplet ({{percentage}}%)",
|
||||
"complete": "Complet (100%)",
|
||||
"refreshing": "Reîmprospătare...",
|
||||
"auto_refresh_notice": "Reîmprospătare automată la fiecare {{seconds}} secunde",
|
||||
"note_queued_for_retry": "Notiță pusă în coadă pentru reîncercare",
|
||||
"failed_to_retry_note": "Eroare la reîncercarea notiței",
|
||||
"all_notes_queued_for_retry": "Toate notițele eșuate au fost puse în coada de reîncercare",
|
||||
"failed_to_retry_all": "Eroare la reîncercarea notițelor",
|
||||
"ai_settings": "Setări AI",
|
||||
"api_key_tooltip": "Cheia API pentru accesarea serviciului",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "Cheia API pentru Anthropic lipsește. Introduceți o cheie API validă.",
|
||||
"openai": "Cheia API pentru OpenAI lipsește. Introduceți o cheie API validă.",
|
||||
"voyage": "Cheia API pentru Voyage lipsește. Introduceți o cheie API validă.",
|
||||
"ollama": "Cheia API pentru Ollama lipsește. Introduceți o cheie API validă."
|
||||
},
|
||||
"agent": {
|
||||
"processing": "Procesare...",
|
||||
"thinking": "Raționalizare...",
|
||||
"loading": "Încărcare...",
|
||||
"generating": "Generare..."
|
||||
},
|
||||
"name": "AI",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Folosește context îmbogățit",
|
||||
"enhanced_context_description": "Oferă AI-ului mai multe informații de context din notiță și notițele similare pentru răspunsuri mai bune",
|
||||
"show_thinking": "Afișează procesul de raționalizare",
|
||||
"show_thinking_description": "Afișează lanțul de acțiuni din procesul de gândire al AI-ului",
|
||||
"enter_message": "Introduceți mesajul...",
|
||||
"error_contacting_provider": "Eroare la contactarea furnizorului de AI. Verificați setările și conexiunea la internet.",
|
||||
"error_generating_response": "Eroare la generarea răspunsului AI",
|
||||
"index_all_notes": "Indexează toate notițele",
|
||||
"index_status": "Starea indexării",
|
||||
"indexed_notes": "Notițe indexate",
|
||||
"indexing_stopped": "Indexarea s-a oprit",
|
||||
"indexing_in_progress": "Indexare în curs...",
|
||||
"last_indexed": "Ultima indexare",
|
||||
"note_chat": "Discuție pe baza notițelor",
|
||||
"sources": "Surse",
|
||||
"start_indexing": "Indexează",
|
||||
"use_advanced_context": "Folosește context îmbogățit",
|
||||
"ollama_no_url": "Ollama nu este configurat. Introduceți un URL corect.",
|
||||
"chat": {
|
||||
"root_note_title": "Discuții cu AI-ul",
|
||||
"root_note_content": "Această notiță stochează conversația cu AI-ul.",
|
||||
"new_chat_title": "Discuție nouă",
|
||||
"create_new_ai_chat": "Crează o nouă discuție cu AI-ul"
|
||||
},
|
||||
"create_new_ai_chat": "Crează o nouă discuție cu AI-ul",
|
||||
"configuration_warnings": "Sunt câteva probleme la configurația AI-ului. Verificați setările.",
|
||||
"experimental_warning": "Funcția LLM este experimentală.",
|
||||
"selected_provider": "Furnizor selectat",
|
||||
"selected_provider_description": "Selectați furnizorul de AI pentru funcțiile de discuție și completare",
|
||||
"select_model": "Selectați modelul...",
|
||||
"select_provider": "Selectați furnizorul...",
|
||||
"ai_enabled": "Funcționalitățile AI au fost activate",
|
||||
"ai_disabled": "Funcționalitățile AI au fost dezactivate",
|
||||
"no_models_found_online": "Nu s-a găsit niciun model. Verificați cheia API și configurația.",
|
||||
"no_models_found_ollama": "Nu s-a găsit niciun model Ollama. Verificați dacă Ollama rulează.",
|
||||
"error_fetching": "Eroare la obținerea modelelor: {{error}}"
|
||||
},
|
||||
"custom_date_time_format": {
|
||||
"title": "Format dată/timp personalizat",
|
||||
"description": "Personalizați formatul de dată și timp inserat prin <shortcut /> sau din bara de unelte. Vedeți <doc>Documentația Day.js</doc> pentru câmpurile de formatare disponibile.",
|
||||
|
||||
@@ -824,7 +824,6 @@
|
||||
"web-view": "Веб-страница",
|
||||
"mind-map": "Mind Map",
|
||||
"geo-map": "Географическая карта",
|
||||
"ai-chat": "ИИ Чат",
|
||||
"task-list": "Список задач",
|
||||
"confirm-change": "Не рекомендуется менять тип заметки, если её содержимое не пустое. Вы всё равно хотите продолжить?"
|
||||
},
|
||||
@@ -1257,149 +1256,6 @@
|
||||
"disabled": "выключено",
|
||||
"title": "Системная панель заголовка (требует перезапуска приложения)"
|
||||
},
|
||||
"ai_llm": {
|
||||
"progress": "Прогресс",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"ollama_tab": "Ollama",
|
||||
"temperature": "Температура",
|
||||
"model": "Модель",
|
||||
"refreshing_models": "Обновление...",
|
||||
"error": "Ошибка",
|
||||
"actions": "Действия",
|
||||
"retry": "Повторить",
|
||||
"never": "Никогда",
|
||||
"refreshing": "Обновление...",
|
||||
"agent": {
|
||||
"processing": "Обработка...",
|
||||
"thinking": "Думаю...",
|
||||
"loading": "Загрузка...",
|
||||
"generating": "Создание..."
|
||||
},
|
||||
"name": "AI",
|
||||
"openai": "OpenAI",
|
||||
"sources": "Источники",
|
||||
"reprocessing_index": "Перестройка индекса...",
|
||||
"processed_notes": "Обработанные заметки",
|
||||
"total_notes": "Всего заметок",
|
||||
"queued_notes": "Заметок в очереди",
|
||||
"failed_notes": "Заметки с ошибками обработки",
|
||||
"last_processed": "Последние обработанные",
|
||||
"refresh_stats": "Обновить статистику",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"system_prompt": "Системный промпт",
|
||||
"openai_configuration": "Конфигурация OpenAI",
|
||||
"openai_settings": "Настройки OpenAI",
|
||||
"api_key": "Ключ API",
|
||||
"url": "Базовый URL",
|
||||
"default_model": "Модель по умолчанию",
|
||||
"base_url": "Базовый URL",
|
||||
"openai_url_description": "По умолчанию: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Настройки Anthropic",
|
||||
"ollama_settings": "Настройки Ollama",
|
||||
"anthropic_configuration": "Конфигурация Anthropic",
|
||||
"voyage_url_description": "По умолчанию: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Конфигурация Ollama",
|
||||
"enable_ollama": "Включить Ollama",
|
||||
"ollama_url": "URL Ollama",
|
||||
"ollama_model": "Модель Ollama",
|
||||
"refresh_models": "Обновить модели",
|
||||
"rebuild_index": "Пересобрать индекс",
|
||||
"note_title": "Название заметки",
|
||||
"last_attempt": "Последняя попытка",
|
||||
"active_providers": "Активные провайдеры",
|
||||
"disabled_providers": "Отключенные провайдеры",
|
||||
"similarity_threshold": "Порок сходства",
|
||||
"processing": "Обработка ({{percentage}}%)",
|
||||
"incomplete": "Не завершено ({{percentage}}%)",
|
||||
"complete": "Завершено (100%)",
|
||||
"ai_settings": "Настройки AI",
|
||||
"show_thinking": "Отображать размышление",
|
||||
"index_status": "Статус индексирования",
|
||||
"indexed_notes": "Проиндексированные заметки",
|
||||
"indexing_stopped": "Индексирование остановлено",
|
||||
"last_indexed": "Индексировано в последний раз",
|
||||
"note_chat": "Чат по заметке",
|
||||
"start_indexing": "Начать индексирование",
|
||||
"chat": {
|
||||
"root_note_title": "Чаты с AI",
|
||||
"new_chat_title": "Новый чат",
|
||||
"create_new_ai_chat": "Создать новый чат с ИИ",
|
||||
"root_note_content": "В этой заметке содержатся сохраненные вами разговоры в чате ИИ."
|
||||
},
|
||||
"selected_provider": "Выбранный провайдер",
|
||||
"select_model": "Выбрать модель...",
|
||||
"select_provider": "Выбрать провайдера...",
|
||||
"title": "Настройки AI",
|
||||
"voyage_settings": "Настройки Voyage AI",
|
||||
"error_contacting_provider": "Ошибка подключения к провайдеру AI. Проверьте настройки и подключение к интернету.",
|
||||
"configuration_warnings": "Возникли проблемы с конфигурацией AI. Проверьте настройки.",
|
||||
"selected_provider_description": "Выберите провайдер AI для функций чата и автодополнения",
|
||||
"provider_configuration": "Конфигурация провайдера AI",
|
||||
"ollama_url_description": "URL для API Ollama (по умолчанию: http://localhost:11434)",
|
||||
"ollama_model_description": "Модель Ollama для автодополнения чата",
|
||||
"temperature_description": "Контролирует случайность ответов (0 = детерминированный, 2 = максимальная случайность)",
|
||||
"system_prompt_description": "Системный промпт по умолчанию, используемый для всех взаимодействий с ИИ",
|
||||
"empty_key_warning": {
|
||||
"openai": "Ключ API OpenAI пуст. Введите действительный ключ API.",
|
||||
"ollama": "API-ключ Ollama пуст. Введите действительный API-ключ.",
|
||||
"voyage": "Ключ API Voyage пуст. Введите действительный ключ API.",
|
||||
"anthropic": "Ключ API Anthropic пуст. Введите действительный ключ API."
|
||||
},
|
||||
"openai_api_key_description": "Ваш ключ API OpenAI для доступа к их службам ИИ",
|
||||
"provider_precedence_description": "Список провайдеров, разделенных запятыми, в порядке приоритета (например, \"openai,anthropic,ollama\")",
|
||||
"remove_provider": "Удалить провайдер из поиска",
|
||||
"not_started": "Не запущено",
|
||||
"provider_precedence": "Приоритет провайдера",
|
||||
"enable_ai_features": "Включить функции AI/LLM",
|
||||
"enable_ai": "Включить функции AI/LLM",
|
||||
"voyage_configuration": "Конфигурация Voyage AI",
|
||||
"enable_automatic_indexing": "Включить автоматическое индексирование",
|
||||
"reprocess_index": "Перестроить индекс поиска",
|
||||
"index_rebuild_progress": "Прогресс перестройки индекса",
|
||||
"index_rebuilding": "Оптимизация индекса ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Оптимизация индекса завершена",
|
||||
"use_enhanced_context": "Использовать улучшенный контекст",
|
||||
"enter_message": "Введите ваше сообщение...",
|
||||
"index_all_notes": "Индексировать все заметки",
|
||||
"indexing_in_progress": "Индексация в процессе...",
|
||||
"use_advanced_context": "Использовать расширенный контекст",
|
||||
"openai_model_description": "Примеры: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"partial": "{{ percentage }}% завершено",
|
||||
"retry_queued": "Примечание поставлено в очередь на повторную попытку",
|
||||
"max_notes_per_llm_query": "Макс. количество заметок на запрос",
|
||||
"reprocess_index_error": "Ошибка перестройки поискового индекса",
|
||||
"auto_refresh_notice": "Автоматически обновляется каждые {{seconds}} секунд",
|
||||
"note_queued_for_retry": "Заметка поставлена в очередь на повторную попытку",
|
||||
"failed_to_retry_note": "Не удалось повторить попытку",
|
||||
"failed_to_retry_all": "Не удалось повторить попытку",
|
||||
"error_generating_response": "Ошибка генерации ответа ИИ",
|
||||
"create_new_ai_chat": "Создать новый чат с ИИ",
|
||||
"ai_enabled": "Возможности ИИ активны",
|
||||
"ai_disabled": "Возможности ИИ неактивны",
|
||||
"restore_provider": "Восстановить значение провайдера",
|
||||
"error_fetching": "Ошибка получения списка моделей: {{error}}",
|
||||
"index_rebuild_status_error": "Ошибка проверки статуса перестроения индекса",
|
||||
"enhanced_context_description": "Предоставляет ИИ больше контекста из заметки и связанных с ней заметок для более точных ответов",
|
||||
"no_models_found_ollama": "Модели Ollama не найдены. Проверьте, запущена ли Ollama.",
|
||||
"no_models_found_online": "Модели не найдены. Проверьте ваш ключ API и настройки.",
|
||||
"experimental_warning": "Функция LLM в настоящее время является экспериментальной — вы предупреждены.",
|
||||
"ollama_no_url": "Ollama не настроена. Введите корректный URL-адрес.",
|
||||
"show_thinking_description": "Показать цепочку мыслительного процесса ИИ",
|
||||
"api_key_tooltip": "API-ключ для доступа к сервису",
|
||||
"all_notes_queued_for_retry": "Все неудачные заметки поставлены в очередь на повторную попытку",
|
||||
"reprocess_index_started": "Оптимизация поискового индекса запущена в фоновом режиме",
|
||||
"similarity_threshold_description": "Минимальный показатель сходства (similarity score, 0–1) для заметок, которые следует включить в контекст запросов LLM",
|
||||
"max_notes_per_llm_query_description": "Максимальное количество похожих заметок для включения в контекст ИИ",
|
||||
"retry_failed": "Не удалось поставить заметку в очередь для повторной попытки",
|
||||
"rebuild_index_error": "Ошибка при запуске перестроения индекса. Подробности смотрите в логах.",
|
||||
"enable_ollama_description": "Включить Ollama для использования локальной модели ИИ",
|
||||
"anthropic_model_description": "Модели Anthropic Claude для автодополнения чата",
|
||||
"anthropic_url_description": "Базовый URL для Anthropic API (по умолчанию: https://api.anthropic.com)",
|
||||
"anthropic_api_key_description": "Ваш ключ Anthropic API для доступа к моделям Claude",
|
||||
"enable_ai_desc": "Включить функции ИИ, такие как резюмирование заметок, генерация контента и другие возможности LLM",
|
||||
"enable_ai_description": "Включить функции ИИ, такие как резюмирование заметок, генерация контента и другие возможности LLM"
|
||||
},
|
||||
"code-editor-options": {
|
||||
"title": "Редактор"
|
||||
},
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"about": {
|
||||
"title": "Podrobnosti Trilium Notes",
|
||||
"homepage": "Domača stran:",
|
||||
"app_version": "Verzija aplikacije:",
|
||||
"db_version": "Verzija DB:",
|
||||
"sync_version": "Verzija Sync:"
|
||||
}
|
||||
"about": {
|
||||
"title": "Podrobnosti Trilium Notes",
|
||||
"homepage": "Domača stran:",
|
||||
"app_version": "Verzija aplikacije:",
|
||||
"db_version": "Verzija DB:",
|
||||
"sync_version": "Verzija Sync:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1493,7 +1493,6 @@
|
||||
"book": "集合",
|
||||
"geo-map": "地理地圖",
|
||||
"beta-feature": "Beta",
|
||||
"ai-chat": "AI 聊天",
|
||||
"task-list": "任務列表",
|
||||
"new-feature": "新增",
|
||||
"collections": "集合"
|
||||
@@ -1743,149 +1742,6 @@
|
||||
"zen_mode": {
|
||||
"button_exit": "退出禪模式"
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "未開始",
|
||||
"title": "AI 設定",
|
||||
"processed_notes": "已處理筆記",
|
||||
"total_notes": "筆記總數",
|
||||
"progress": "進度",
|
||||
"queued_notes": "隊列中筆記",
|
||||
"failed_notes": "失敗筆記",
|
||||
"last_processed": "最後處理時間",
|
||||
"refresh_stats": "更新統計資料",
|
||||
"enable_ai_features": "啟用 AI/LLM 功能",
|
||||
"enable_ai_description": "啟用筆記摘要、內容生成等 AI 功能及其他 LLM 能力",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "啟用 AI/LLM 功能",
|
||||
"enable_ai_desc": "啟用筆記摘要、內容生成等 AI 功能及其他 LLM 能力",
|
||||
"provider_configuration": "AI 提供者設定",
|
||||
"provider_precedence": "提供者優先級",
|
||||
"provider_precedence_description": "依優先級排序的提供者列表(用逗號分隔,例如:'openai,anthropic,ollama')",
|
||||
"temperature": "溫度",
|
||||
"temperature_description": "控制回應的隨機性(0 = 確定性,2 = 最大隨機性)",
|
||||
"system_prompt": "系統提示詞",
|
||||
"system_prompt_description": "所有 AI 互動的預設系統提示詞",
|
||||
"openai_configuration": "OpenAI 設定",
|
||||
"openai_settings": "OpenAI 設定",
|
||||
"api_key": "API 金鑰",
|
||||
"url": "基礎 URL",
|
||||
"model": "模型",
|
||||
"openai_api_key_description": "用於存取 OpenAI 服務的 API 金鑰",
|
||||
"anthropic_api_key_description": "用於存取 Claude 模型的 Anthropic API 金鑰",
|
||||
"default_model": "預設模型",
|
||||
"openai_model_description": "範例:gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "基礎 URL",
|
||||
"openai_url_description": "預設:https://api.openai.com/v1",
|
||||
"anthropic_settings": "Anthropic 設定",
|
||||
"anthropic_url_description": "Anthropic API 的基礎 URL(預設:https://api.anthropic.com)",
|
||||
"anthropic_model_description": "用於聊天補全的 Anthropic Claude 模型",
|
||||
"voyage_settings": "Voyage AI 設定",
|
||||
"ollama_settings": "Ollama 設定",
|
||||
"ollama_url_description": "Ollama API URL(預設:http://localhost:11434)",
|
||||
"ollama_model_description": "用於聊天補全的 Ollama 模型",
|
||||
"anthropic_configuration": "Anthropic 設定",
|
||||
"voyage_configuration": "Voyage AI 設定",
|
||||
"voyage_url_description": "預設:https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Ollama 設定",
|
||||
"enable_ollama": "啟用 Ollama",
|
||||
"enable_ollama_description": "啟用 Ollama 以使用本地 AI 模型",
|
||||
"ollama_url": "Ollama URL",
|
||||
"ollama_model": "Ollama 模型",
|
||||
"refresh_models": "重新整理模型",
|
||||
"refreshing_models": "正在重新整理…",
|
||||
"enable_automatic_indexing": "啟用自動索引",
|
||||
"rebuild_index": "重建索引",
|
||||
"rebuild_index_error": "啟動索引重建失敗。請查看日誌了解詳情。",
|
||||
"note_title": "筆記標題",
|
||||
"error": "錯誤",
|
||||
"last_attempt": "最後嘗試時間",
|
||||
"actions": "操作",
|
||||
"retry": "重試",
|
||||
"partial": "已完成 {{ percentage }}%",
|
||||
"retry_queued": "筆記已加入重試隊列",
|
||||
"retry_failed": "筆記加入重試隊列失敗",
|
||||
"max_notes_per_llm_query": "每次查詢的最大筆記數",
|
||||
"max_notes_per_llm_query_description": "AI 上下文包含的最大相似筆記數量",
|
||||
"active_providers": "活躍提供者",
|
||||
"disabled_providers": "已禁用的提供者",
|
||||
"remove_provider": "從搜尋中移除提供者",
|
||||
"restore_provider": "將提供者還原至搜尋中",
|
||||
"similarity_threshold": "相似度閾值",
|
||||
"similarity_threshold_description": "要包含在 LLM 查詢上下文中筆記的最低相似度分數(0-1)",
|
||||
"reprocess_index": "重建搜尋索引",
|
||||
"reprocessing_index": "正在重建…",
|
||||
"reprocess_index_started": "搜尋索引最佳化已在背景啟動",
|
||||
"reprocess_index_error": "重建搜尋索引失敗",
|
||||
"index_rebuild_progress": "索引重建進度",
|
||||
"index_rebuilding": "正在最佳化索引({{percentage}}%)",
|
||||
"index_rebuild_complete": "完成索引最佳化",
|
||||
"index_rebuild_status_error": "檢查索引重建狀態失敗",
|
||||
"never": "從未",
|
||||
"processing": "正在處理({{percentage}}%)",
|
||||
"incomplete": "未完成({{percentage}}%)",
|
||||
"complete": "已完成(100%)",
|
||||
"refreshing": "正在重新整理…",
|
||||
"auto_refresh_notice": "每 {{seconds}} 秒自動重新整理",
|
||||
"note_queued_for_retry": "筆記已加入重試隊列",
|
||||
"failed_to_retry_note": "重試筆記失敗",
|
||||
"all_notes_queued_for_retry": "所有失敗筆記已加入重試隊列",
|
||||
"failed_to_retry_all": "重試筆記失敗",
|
||||
"ai_settings": "AI 設定",
|
||||
"api_key_tooltip": "用於存取服務的 API 金鑰",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "Anthropic API 金鑰為空。請輸入有效的 API 金鑰。",
|
||||
"openai": "OpenAI API 金鑰為空。請輸入有效的 API 金鑰。",
|
||||
"voyage": "Voyage API 金鑰為空。請輸入有效的 API 金鑰。",
|
||||
"ollama": "Ollama API 金鑰為空。請輸入有效的 API 金鑰。"
|
||||
},
|
||||
"agent": {
|
||||
"processing": "正在處理…",
|
||||
"thinking": "正在思考…",
|
||||
"loading": "正在載入…",
|
||||
"generating": "正在生成…"
|
||||
},
|
||||
"name": "AI",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "使用增強的上下文",
|
||||
"enhanced_context_description": "提供 AI 更多來自筆記及其相關筆記的內容,以獲得更好的回應",
|
||||
"show_thinking": "顯示思考過程",
|
||||
"show_thinking_description": "顯示 AI 的思維鏈過程",
|
||||
"enter_message": "輸入您的訊息…",
|
||||
"error_contacting_provider": "聯繫 AI 提供者失敗。請檢查您的設定和網路連接。",
|
||||
"error_generating_response": "生成 AI 回應失敗",
|
||||
"index_all_notes": "為所有筆記建立索引",
|
||||
"index_status": "索引狀態",
|
||||
"indexed_notes": "已索引筆記",
|
||||
"indexing_stopped": "已停止索引",
|
||||
"indexing_in_progress": "正在進行索引…",
|
||||
"last_indexed": "最後索引時間",
|
||||
"note_chat": "筆記聊天",
|
||||
"sources": "來源",
|
||||
"start_indexing": "開始索引",
|
||||
"use_advanced_context": "使用進階上下文",
|
||||
"ollama_no_url": "尚未設定 Ollama。請輸入有效的 URL。",
|
||||
"chat": {
|
||||
"root_note_title": "AI 聊天記錄",
|
||||
"root_note_content": "此筆記包含您儲存的 AI 聊天對話。",
|
||||
"new_chat_title": "新聊天",
|
||||
"create_new_ai_chat": "建立新的 AI 聊天"
|
||||
},
|
||||
"create_new_ai_chat": "建立新的 AI 聊天",
|
||||
"configuration_warnings": "您的 AI 配置存在一些問題。請檢查您的設定。",
|
||||
"experimental_warning": "特此提醒:LLM 功能目前正處於實驗階段。",
|
||||
"selected_provider": "已選提供者",
|
||||
"selected_provider_description": "選擇用於聊天和補全功能的 AI 提供者",
|
||||
"select_model": "選擇模型…",
|
||||
"select_provider": "選擇提供者…",
|
||||
"ai_enabled": "已啟用 AI 功能",
|
||||
"ai_disabled": "已禁用 AI 功能",
|
||||
"no_models_found_online": "找不到模型。請檢查您的 API 金鑰及設定。",
|
||||
"no_models_found_ollama": "找不到 Ollama 模型。請確認 Ollama 是否正在執行。",
|
||||
"error_fetching": "獲取模型失敗:{{error}}"
|
||||
},
|
||||
"code-editor-options": {
|
||||
"title": "編輯器"
|
||||
},
|
||||
|
||||
@@ -1236,149 +1236,6 @@
|
||||
"layout-vertical-description": "Панель запуску знаходиться ліворуч (за замовчуванням)",
|
||||
"layout-horizontal-description": "Панель запуску знаходиться під панеллю вкладок, панель вкладок тепер має повну ширину."
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "Не розпочато",
|
||||
"title": "Параметри AI",
|
||||
"processed_notes": "Оброблені нотатки",
|
||||
"total_notes": "Всього нотаток",
|
||||
"progress": "Прогрес",
|
||||
"queued_notes": "Черга нотаток",
|
||||
"failed_notes": "Невдалі нотатки",
|
||||
"last_processed": "Остання обробка",
|
||||
"refresh_stats": "Оновити статистику",
|
||||
"enable_ai_features": "Увімкнути функції AI/LLM",
|
||||
"enable_ai_description": "Увімкніть функції AI, такі як підсумовування нотаток, генерація контенту та інші можливості LLM",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Увімкнути функції AI/LLM",
|
||||
"enable_ai_desc": "Увімкнути функції AI, такі як підсумовування нотаток, генерація контенту та інші можливості LLM",
|
||||
"provider_configuration": "Конфігурація постачальника AI",
|
||||
"provider_precedence": "Пріоритет постачальника",
|
||||
"provider_precedence_description": "Список постачальників, розділених комами, у порядку пріоритету (наприклад, «openai,anthropic,ollama»)",
|
||||
"temperature": "Температура",
|
||||
"temperature_description": "Контролює випадковість відповідей (0 = детермінований, 2 = максимальна випадковість)",
|
||||
"system_prompt": "Системний Запит (Prompt)",
|
||||
"system_prompt_description": "Системний запит (prompt) за замовчуванням використовується для всіх взаємодій з AI",
|
||||
"openai_configuration": "Конфігурація OpenAI",
|
||||
"openai_settings": "Налаштування OpenAI",
|
||||
"api_key": "API Key",
|
||||
"url": "Base URL",
|
||||
"model": "Модель",
|
||||
"openai_api_key_description": "Ваш ключ OpenAI API для доступу до служб AI",
|
||||
"anthropic_api_key_description": "Ваш ключ Anthropic API для доступу до моделей Claude",
|
||||
"default_model": "Модель за замовчуванням",
|
||||
"openai_model_description": "Наприклад: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "Base URL",
|
||||
"openai_url_description": "За замовчуванням: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Налаштування Anthropic",
|
||||
"anthropic_url_description": "Базова URL-адреса для Anthropic API (за замовчуванням: https://api.anthropic.com)",
|
||||
"anthropic_model_description": "Моделі Anthropic Claude для чату",
|
||||
"voyage_settings": "Налаштування Voyage AI",
|
||||
"ollama_settings": "Налаштування Ollama",
|
||||
"ollama_url_description": "URL для Ollama API (default: http://localhost:11434)",
|
||||
"ollama_model_description": "Модель Ollama для чату",
|
||||
"anthropic_configuration": "Конфігурація Anthropic",
|
||||
"voyage_configuration": "Конфігурація Voyage AI",
|
||||
"voyage_url_description": "За замовчуванням: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Конфігурація Ollama",
|
||||
"enable_ollama": "Увімкнути Ollama",
|
||||
"enable_ollama_description": "Увімкнути Ollama для локальної моделі AI",
|
||||
"ollama_url": "Ollama URL",
|
||||
"ollama_model": "Модель Ollama",
|
||||
"refresh_models": "Оновити моделі",
|
||||
"refreshing_models": "Оновлення...",
|
||||
"enable_automatic_indexing": "Увімкнути автоматичне індексування",
|
||||
"rebuild_index": "Перебудувати індекс",
|
||||
"rebuild_index_error": "Помилка початку перебудови індексу. Перегляньте logs для інформації.",
|
||||
"note_title": "Заголовок нотатки",
|
||||
"error": "Помилка",
|
||||
"last_attempt": "Остання спроба",
|
||||
"actions": "Дії",
|
||||
"retry": "Повторити спробу",
|
||||
"partial": "{{ percentage }}% completed",
|
||||
"retry_queued": "Нотатка в черзі на повторну спробу",
|
||||
"retry_failed": "Не вдалося додати нотатку до черги для повторної спроби",
|
||||
"max_notes_per_llm_query": "Максимальна кількість нотаток на запит",
|
||||
"max_notes_per_llm_query_description": "Максимальна кількість схожих нотаток для включення в контекст AI",
|
||||
"active_providers": "Активні постачальники",
|
||||
"disabled_providers": "Вимкнути постачальників",
|
||||
"remove_provider": "Видалити постачальника з пошуку",
|
||||
"restore_provider": "Відновити постачальника для пошуку",
|
||||
"similarity_threshold": "Поріг схожості",
|
||||
"similarity_threshold_description": "Мінімальна оцінка схожості (0-1) для нотаток, що включатимуться в контекст для запитів LLM",
|
||||
"reprocess_index": "Перебудувати індекс пошуку",
|
||||
"reprocessing_index": "Відбудова...",
|
||||
"reprocess_index_started": "Оптимізація пошукового індексу розпочата у фоновому режимі",
|
||||
"reprocess_index_error": "Помилка відбудови індексу пошуку",
|
||||
"index_rebuild_progress": "Прогрес відбудови індексу",
|
||||
"index_rebuilding": "Індекс оптимізації ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Оптимізацію індексу завершено",
|
||||
"index_rebuild_status_error": "Помилка перевірки стану перебудови індексу",
|
||||
"never": "Ніколи",
|
||||
"processing": "Обробка ({{percentage}}%)",
|
||||
"incomplete": "Незавершено ({{percentage}}%)",
|
||||
"complete": "Завершено (100%)",
|
||||
"refreshing": "Оновлення...",
|
||||
"auto_refresh_notice": "Автоматичне оновлення кожні {{seconds}} секунд",
|
||||
"note_queued_for_retry": "Нотатка в черзі на повторну спробу",
|
||||
"failed_to_retry_note": "Не вдалося повторити спробу",
|
||||
"all_notes_queued_for_retry": "Усі невдалі нотатки поставлені в чергу на повторну спробу",
|
||||
"failed_to_retry_all": "Не вдалося повторити спробу",
|
||||
"ai_settings": "Налаштування AI",
|
||||
"api_key_tooltip": "Ключ API для доступу до сервісу",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "Ключ API Anthropic порожній. Будь ласка, введіть дійсний ключ API.",
|
||||
"openai": "Ключ API OpenAI порожній. Будь ласка, введіть дійсний ключ API.",
|
||||
"voyage": "Ключ Voyage API подорожі порожній. Будь ласка, введіть дійсний ключ API.",
|
||||
"ollama": "Ключ API Ollama порожній. Будь ласка, введіть дійсний ключ API."
|
||||
},
|
||||
"agent": {
|
||||
"processing": "Обробка...",
|
||||
"thinking": "Думаю...",
|
||||
"loading": "Завантаження...",
|
||||
"generating": "Генерування..."
|
||||
},
|
||||
"name": "AI",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Використовувати покращений контекст",
|
||||
"enhanced_context_description": "Надає AI більше контексту з нотатки та пов'язаних з нею нотаток для кращих відповідей",
|
||||
"show_thinking": "Показати міркування",
|
||||
"show_thinking_description": "Показати ланцюжок міркувань AI",
|
||||
"enter_message": "Введіть ваше повідомлення...",
|
||||
"error_contacting_provider": "Помилка зв’язку з постачальником AI. Перевірте налаштування та підключення до Інтернету.",
|
||||
"error_generating_response": "Помилка створення відповіді AI",
|
||||
"index_all_notes": "Індексація усіх нотаток",
|
||||
"index_status": "Статус індексації",
|
||||
"indexed_notes": "Індексовані нотатки",
|
||||
"indexing_stopped": "Індексацію зупинено",
|
||||
"indexing_in_progress": "Триває індексація...",
|
||||
"last_indexed": "Остання індексація",
|
||||
"note_chat": "Нотатка Чат",
|
||||
"sources": "Джерела",
|
||||
"start_indexing": "Почати індексацію",
|
||||
"use_advanced_context": "Використовувати розширений контекст",
|
||||
"ollama_no_url": "Ollama не налаштовано. Будь ласка, введіть дійсну URL-адресу.",
|
||||
"chat": {
|
||||
"root_note_title": "AI Чати",
|
||||
"root_note_content": "Ця нотатка містить ваші збережені розмови в чаті з AI.",
|
||||
"new_chat_title": "Новий Чат",
|
||||
"create_new_ai_chat": "Створити новий AI Чат"
|
||||
},
|
||||
"create_new_ai_chat": "Створити новий AI Чат",
|
||||
"configuration_warnings": "Виникли деякі проблеми з конфігурацією AI. Перевірте налаштування.",
|
||||
"experimental_warning": "Функція LLM наразі є експериментальною – вас попередили.",
|
||||
"selected_provider": "Вибраний постачальник",
|
||||
"selected_provider_description": "Вибрати постачальника послуг AI для функцій чату та автозаповнення",
|
||||
"select_model": "Виберіть модель...",
|
||||
"select_provider": "Виберіть постачальника...",
|
||||
"ai_enabled": "Функції AI увімкнено",
|
||||
"ai_disabled": "Функції AI вимкнено",
|
||||
"no_models_found_online": "Моделей не знайдено. Будь ласка, перевірте свій ключ API та налаштування.",
|
||||
"no_models_found_ollama": "Моделей Ollama не знайдено. Перевірте, чи працює Ollama.",
|
||||
"error_fetching": "Помилка отримання моделей: {{error}}"
|
||||
},
|
||||
"backup": {
|
||||
"automatic_backup": "Автоматичне резервне копіювання",
|
||||
"automatic_backup_description": "Trilium може автоматично створювати резервні копії бази даних:",
|
||||
@@ -1957,7 +1814,6 @@
|
||||
"confirm-change": "Не рекомендується змінювати тип нотатки, якщо її вміст не порожній. Ви все одно хочете продовжити?",
|
||||
"geo-map": "Географічна карта",
|
||||
"beta-feature": "Бета",
|
||||
"ai-chat": "Чат AI",
|
||||
"task-list": "Список завдань",
|
||||
"new-feature": "Нова",
|
||||
"collections": "Колекції",
|
||||
|
||||
@@ -10,7 +10,7 @@ import BookmarkButtons from "./BookmarkButtons";
|
||||
import CalendarWidget from "./CalendarWidget";
|
||||
import HistoryNavigationButton from "./HistoryNavigation";
|
||||
import { LaunchBarContext } from "./launch_bar_widgets";
|
||||
import { AiChatButton, CommandButton, CustomWidget, NoteLauncher, QuickSearchLauncherWidget, ScriptLauncher, TodayLauncher } from "./LauncherDefinitions";
|
||||
import { CommandButton, CustomWidget, NoteLauncher, QuickSearchLauncherWidget, ScriptLauncher, TodayLauncher } from "./LauncherDefinitions";
|
||||
import ProtectedSessionStatusWidget from "./ProtectedSessionStatusWidget";
|
||||
import SpacerWidget from "./SpacerWidget";
|
||||
import SyncStatus from "./SyncStatus";
|
||||
@@ -67,7 +67,7 @@ function Launcher({ note, isHorizontalLayout }: { note: FNote, isHorizontalLayou
|
||||
case "builtinWidget":
|
||||
return initBuiltinWidget(note, isHorizontalLayout);
|
||||
default:
|
||||
throw new Error(`Unrecognized launcher type '${launcherType}' for launcher '${note.noteId}' title '${note.title}'`);
|
||||
console.warn(`Unrecognized launcher type '${launcherType}' for launcher '${note.noteId}' title '${note.title}'`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,12 +96,10 @@ function initBuiltinWidget(note: FNote, isHorizontalLayout: boolean) {
|
||||
return <TodayLauncher launcherNote={note} />;
|
||||
case "quickSearch":
|
||||
return <QuickSearchLauncherWidget />;
|
||||
case "aiChatLauncher":
|
||||
return <AiChatButton launcherNote={note} />;
|
||||
case "mobileTabSwitcher":
|
||||
return <TabSwitcher />;
|
||||
default:
|
||||
throw new Error(`Unrecognized builtin widget ${builtinWidget} for launcher ${note.noteId} "${note.title}"`);
|
||||
console.warn(`Unrecognized builtin widget ${builtinWidget} for launcher ${note.noteId} "${note.title}"`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import { getErrorMessage, isMobile } from "../../services/utils";
|
||||
import BasicWidget from "../basic_widget";
|
||||
import NoteContextAwareWidget from "../note_context_aware_widget";
|
||||
import QuickSearchWidget from "../quick_search";
|
||||
import { useGlobalShortcut, useLegacyWidget, useNoteLabel, useNoteRelationTarget, useTriliumOptionBool } from "../react/hooks";
|
||||
import { useGlobalShortcut, useLegacyWidget, useNoteLabel, useNoteRelationTarget } from "../react/hooks";
|
||||
import { ParentComponent } from "../react/react_utils";
|
||||
import { CustomNoteLauncher } from "./GenericButtons";
|
||||
import { LaunchBarActionButton, LaunchBarContext, LauncherNoteProps, useLauncherIconAndTitle } from "./launch_bar_widgets";
|
||||
@@ -81,19 +81,6 @@ export function ScriptLauncher({ launcherNote }: LauncherNoteProps) {
|
||||
);
|
||||
}
|
||||
|
||||
export function AiChatButton({ launcherNote }: LauncherNoteProps) {
|
||||
const [ aiEnabled ] = useTriliumOptionBool("aiEnabled");
|
||||
const { icon, title } = useLauncherIconAndTitle(launcherNote);
|
||||
|
||||
return aiEnabled && (
|
||||
<LaunchBarActionButton
|
||||
icon={icon}
|
||||
text={title}
|
||||
triggerCommand="createAiChat"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export function TodayLauncher({ launcherNote }: LauncherNoteProps) {
|
||||
return (
|
||||
<CustomNoteLauncher
|
||||
|
||||
@@ -1,260 +0,0 @@
|
||||
/**
|
||||
* Communication functions for LLM Chat
|
||||
*/
|
||||
import server from "../../services/server.js";
|
||||
import type { SessionResponse } from "./types.js";
|
||||
|
||||
/**
|
||||
* Create a new chat session
|
||||
* @param currentNoteId - Optional current note ID for context
|
||||
* @returns The noteId of the created chat note
|
||||
*/
|
||||
export async function createChatSession(currentNoteId?: string): Promise<string | null> {
|
||||
try {
|
||||
const resp = await server.post<SessionResponse>('llm/chat', {
|
||||
title: 'Note Chat',
|
||||
currentNoteId: currentNoteId // Pass the current note ID if available
|
||||
});
|
||||
|
||||
if (resp && resp.id) {
|
||||
// Backend returns the chat note ID as 'id'
|
||||
return resp.id;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to create chat session:', error);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a chat note exists
|
||||
* @param noteId - The ID of the chat note
|
||||
*/
|
||||
export async function checkSessionExists(noteId: string): Promise<boolean> {
|
||||
try {
|
||||
const sessionCheck = await server.getWithSilentNotFound<any>(`llm/chat/${noteId}`);
|
||||
return !!(sessionCheck && sessionCheck.id);
|
||||
} catch (error: any) {
|
||||
console.log(`Error checking chat note ${noteId}:`, error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up streaming response via WebSocket
|
||||
* @param noteId - The ID of the chat note
|
||||
* @param messageParams - Message parameters
|
||||
* @param onContentUpdate - Callback for content updates
|
||||
* @param onThinkingUpdate - Callback for thinking updates
|
||||
* @param onToolExecution - Callback for tool execution
|
||||
* @param onComplete - Callback for completion
|
||||
* @param onError - Callback for errors
|
||||
*/
|
||||
export async function setupStreamingResponse(
|
||||
noteId: string,
|
||||
messageParams: any,
|
||||
onContentUpdate: (content: string, isDone?: boolean) => void,
|
||||
onThinkingUpdate: (thinking: string) => void,
|
||||
onToolExecution: (toolData: any) => void,
|
||||
onComplete: () => void,
|
||||
onError: (error: Error) => void
|
||||
): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
let assistantResponse = '';
|
||||
let receivedAnyContent = false;
|
||||
let timeoutId: number | null = null;
|
||||
let initialTimeoutId: number | null = null;
|
||||
let cleanupTimeoutId: number | null = null;
|
||||
let receivedAnyMessage = false;
|
||||
let eventListener: ((event: Event) => void) | null = null;
|
||||
let lastMessageTimestamp = 0;
|
||||
|
||||
// Create a unique identifier for this response process
|
||||
const responseId = `llm-stream-${Date.now()}-${Math.floor(Math.random() * 1000)}`;
|
||||
console.log(`[${responseId}] Setting up WebSocket streaming for chat note ${noteId}`);
|
||||
|
||||
// Send the initial request to initiate streaming
|
||||
(async () => {
|
||||
try {
|
||||
const streamResponse = await server.post<any>(`llm/chat/${noteId}/messages/stream`, {
|
||||
content: messageParams.content,
|
||||
useAdvancedContext: messageParams.useAdvancedContext,
|
||||
showThinking: messageParams.showThinking,
|
||||
options: {
|
||||
temperature: 0.7,
|
||||
maxTokens: 2000
|
||||
}
|
||||
});
|
||||
|
||||
if (!streamResponse || !streamResponse.success) {
|
||||
console.error(`[${responseId}] Failed to initiate streaming`);
|
||||
reject(new Error('Failed to initiate streaming'));
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`[${responseId}] Streaming initiated successfully`);
|
||||
} catch (error) {
|
||||
console.error(`[${responseId}] Error initiating streaming:`, error);
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
})();
|
||||
|
||||
// Function to safely perform cleanup
|
||||
const performCleanup = () => {
|
||||
if (cleanupTimeoutId) {
|
||||
window.clearTimeout(cleanupTimeoutId);
|
||||
cleanupTimeoutId = null;
|
||||
}
|
||||
|
||||
console.log(`[${responseId}] Performing final cleanup of event listener`);
|
||||
cleanupEventListener(eventListener);
|
||||
onComplete();
|
||||
resolve();
|
||||
};
|
||||
|
||||
// Set initial timeout to catch cases where no message is received at all
|
||||
initialTimeoutId = window.setTimeout(() => {
|
||||
if (!receivedAnyMessage) {
|
||||
console.error(`[${responseId}] No initial message received within timeout`);
|
||||
performCleanup();
|
||||
reject(new Error('No response received from server'));
|
||||
}
|
||||
}, 10000);
|
||||
|
||||
// Create a message handler for CustomEvents
|
||||
eventListener = (event: Event) => {
|
||||
const customEvent = event as CustomEvent;
|
||||
const message = customEvent.detail;
|
||||
|
||||
// Only process messages for our chat note
|
||||
if (!message || message.chatNoteId !== noteId) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Update last message timestamp
|
||||
lastMessageTimestamp = Date.now();
|
||||
|
||||
// Cancel any pending cleanup when we receive a new message
|
||||
if (cleanupTimeoutId) {
|
||||
console.log(`[${responseId}] Cancelling scheduled cleanup due to new message`);
|
||||
window.clearTimeout(cleanupTimeoutId);
|
||||
cleanupTimeoutId = null;
|
||||
}
|
||||
|
||||
console.log(`[${responseId}] LLM Stream message received: content=${!!message.content}, contentLength=${message.content?.length || 0}, thinking=${!!message.thinking}, toolExecution=${!!message.toolExecution}, done=${!!message.done}`);
|
||||
|
||||
// Mark first message received
|
||||
if (!receivedAnyMessage) {
|
||||
receivedAnyMessage = true;
|
||||
console.log(`[${responseId}] First message received for chat note ${noteId}`);
|
||||
|
||||
// Clear the initial timeout since we've received a message
|
||||
if (initialTimeoutId !== null) {
|
||||
window.clearTimeout(initialTimeoutId);
|
||||
initialTimeoutId = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Handle error
|
||||
if (message.error) {
|
||||
console.error(`[${responseId}] Stream error: ${message.error}`);
|
||||
performCleanup();
|
||||
reject(new Error(message.error));
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle thinking updates - only show if showThinking is enabled
|
||||
if (message.thinking && messageParams.showThinking) {
|
||||
console.log(`[${responseId}] Received thinking: ${message.thinking.substring(0, 100)}...`);
|
||||
onThinkingUpdate(message.thinking);
|
||||
}
|
||||
|
||||
// Handle tool execution updates
|
||||
if (message.toolExecution) {
|
||||
console.log(`[${responseId}] Tool execution update:`, message.toolExecution);
|
||||
onToolExecution(message.toolExecution);
|
||||
}
|
||||
|
||||
// Handle content updates
|
||||
if (message.content) {
|
||||
// Simply append the new content - no complex deduplication
|
||||
assistantResponse += message.content;
|
||||
|
||||
// Update the UI immediately with each chunk
|
||||
onContentUpdate(assistantResponse, message.done || false);
|
||||
receivedAnyContent = true;
|
||||
|
||||
// Reset timeout since we got content
|
||||
if (timeoutId !== null) {
|
||||
window.clearTimeout(timeoutId);
|
||||
}
|
||||
|
||||
// Set new timeout
|
||||
timeoutId = window.setTimeout(() => {
|
||||
console.warn(`[${responseId}] Stream timeout for chat note ${noteId}`);
|
||||
performCleanup();
|
||||
reject(new Error('Stream timeout'));
|
||||
}, 30000);
|
||||
}
|
||||
|
||||
// Handle completion
|
||||
if (message.done) {
|
||||
console.log(`[${responseId}] Stream completed for chat note ${noteId}, final response: ${assistantResponse.length} chars`);
|
||||
|
||||
// Clear all timeouts
|
||||
if (timeoutId !== null) {
|
||||
window.clearTimeout(timeoutId);
|
||||
timeoutId = null;
|
||||
}
|
||||
|
||||
// Schedule cleanup after a brief delay to ensure all processing is complete
|
||||
cleanupTimeoutId = window.setTimeout(() => {
|
||||
performCleanup();
|
||||
}, 100);
|
||||
}
|
||||
};
|
||||
|
||||
// Register the event listener for WebSocket messages
|
||||
window.addEventListener('llm-stream-message', eventListener);
|
||||
|
||||
console.log(`[${responseId}] Event listener registered, waiting for messages...`);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean up an event listener
|
||||
*/
|
||||
function cleanupEventListener(listener: ((event: Event) => void) | null): void {
|
||||
if (listener) {
|
||||
try {
|
||||
window.removeEventListener('llm-stream-message', listener);
|
||||
console.log(`Successfully removed event listener`);
|
||||
} catch (err) {
|
||||
console.error(`Error removing event listener:`, err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a direct response from the server without streaming
|
||||
*/
|
||||
export async function getDirectResponse(noteId: string, messageParams: any): Promise<any> {
|
||||
try {
|
||||
const postResponse = await server.post<any>(`llm/chat/${noteId}/messages`, {
|
||||
message: messageParams.content,
|
||||
includeContext: messageParams.useAdvancedContext,
|
||||
options: {
|
||||
temperature: 0.7,
|
||||
maxTokens: 2000
|
||||
}
|
||||
});
|
||||
|
||||
return postResponse;
|
||||
} catch (error) {
|
||||
console.error('Error getting direct response:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
/**
|
||||
* LLM Chat Panel Widget Module
|
||||
*/
|
||||
import LlmChatPanel from './llm_chat_panel.js';
|
||||
|
||||
export default LlmChatPanel;
|
||||
@@ -1,59 +0,0 @@
|
||||
/**
|
||||
* Message processing functions for LLM Chat
|
||||
*/
|
||||
import type { ToolExecutionStep } from "./types.js";
|
||||
|
||||
/**
|
||||
* Extract tool execution steps from the DOM that are within the chat flow
|
||||
*/
|
||||
export function extractInChatToolSteps(chatMessagesElement: HTMLElement): ToolExecutionStep[] {
|
||||
const steps: ToolExecutionStep[] = [];
|
||||
|
||||
// Look for tool execution in the chat flow
|
||||
const toolExecutionElement = chatMessagesElement.querySelector('.chat-tool-execution');
|
||||
|
||||
if (toolExecutionElement) {
|
||||
// Find all tool step elements
|
||||
const stepElements = toolExecutionElement.querySelectorAll('.tool-step');
|
||||
|
||||
stepElements.forEach(stepEl => {
|
||||
const stepHtml = stepEl.innerHTML;
|
||||
|
||||
// Determine the step type based on icons or classes present
|
||||
let type = 'info';
|
||||
let name: string | undefined;
|
||||
let content = '';
|
||||
|
||||
if (stepHtml.includes('bx-code-block')) {
|
||||
type = 'executing';
|
||||
content = 'Executing tools...';
|
||||
} else if (stepHtml.includes('bx-terminal')) {
|
||||
type = 'result';
|
||||
// Extract the tool name from the step
|
||||
const nameMatch = stepHtml.match(/<span[^>]*>Tool: ([^<]+)<\/span>/);
|
||||
name = nameMatch ? nameMatch[1] : 'unknown';
|
||||
|
||||
// Extract the content from the div with class mt-1 ps-3
|
||||
const contentEl = stepEl.querySelector('.mt-1.ps-3');
|
||||
content = contentEl ? contentEl.innerHTML : '';
|
||||
} else if (stepHtml.includes('bx-error-circle')) {
|
||||
type = 'error';
|
||||
const nameMatch = stepHtml.match(/<span[^>]*>Tool: ([^<]+)<\/span>/);
|
||||
name = nameMatch ? nameMatch[1] : 'unknown';
|
||||
|
||||
const contentEl = stepEl.querySelector('.mt-1.ps-3.text-danger');
|
||||
content = contentEl ? contentEl.innerHTML : '';
|
||||
} else if (stepHtml.includes('bx-message-dots')) {
|
||||
type = 'generating';
|
||||
content = 'Generating response with tool results...';
|
||||
} else if (stepHtml.includes('bx-loader-alt')) {
|
||||
// Skip the initializing spinner
|
||||
return;
|
||||
}
|
||||
|
||||
steps.push({ type, name, content });
|
||||
});
|
||||
}
|
||||
|
||||
return steps;
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
/**
|
||||
* Types for LLM Chat Panel
|
||||
*/
|
||||
|
||||
export interface ChatResponse {
|
||||
id: string;
|
||||
messages: Array<{role: string; content: string}>;
|
||||
sources?: Array<{noteId: string; title: string}>;
|
||||
}
|
||||
|
||||
export interface SessionResponse {
|
||||
id: string;
|
||||
title: string;
|
||||
noteId: string; // The ID of the chat note
|
||||
}
|
||||
|
||||
export interface ToolExecutionStep {
|
||||
type: string;
|
||||
name?: string;
|
||||
content: string;
|
||||
}
|
||||
|
||||
export interface MessageData {
|
||||
role: string;
|
||||
content: string;
|
||||
timestamp?: Date;
|
||||
mentions?: Array<{
|
||||
noteId: string;
|
||||
title: string;
|
||||
notePath: string;
|
||||
}>;
|
||||
}
|
||||
|
||||
export interface ChatData {
|
||||
messages: MessageData[];
|
||||
noteId: string; // The ID of the chat note
|
||||
chatNoteId?: string; // Deprecated - kept for backward compatibility, should equal noteId
|
||||
toolSteps: ToolExecutionStep[];
|
||||
sources?: Array<{
|
||||
noteId: string;
|
||||
title: string;
|
||||
similarity?: number;
|
||||
content?: string;
|
||||
}>;
|
||||
metadata?: {
|
||||
model?: string;
|
||||
provider?: string;
|
||||
temperature?: number;
|
||||
maxTokens?: number;
|
||||
lastUpdated?: string;
|
||||
toolExecutions?: Array<{
|
||||
id: string;
|
||||
name: string;
|
||||
arguments: any;
|
||||
result: any;
|
||||
error?: string;
|
||||
timestamp: string;
|
||||
}>;
|
||||
};
|
||||
}
|
||||
@@ -1,272 +0,0 @@
|
||||
/**
|
||||
* UI-related functions for LLM Chat
|
||||
*/
|
||||
import { t } from "../../services/i18n.js";
|
||||
import type { ToolExecutionStep } from "./types.js";
|
||||
import { formatMarkdown, applyHighlighting } from "./utils.js";
|
||||
|
||||
// Template for the chat widget
|
||||
export const TPL = `
|
||||
<div class="note-context-chat h-100 w-100 d-flex flex-column">
|
||||
<!-- Move validation warning outside the card with better styling -->
|
||||
<div class="provider-validation-warning alert alert-warning m-2 border-inline-start border-warning" style="display: none; padding-inline-start: 15px; border-inline-start: 4px solid #ffc107; background-color: rgba(255, 248, 230, 0.9); font-size: 0.9rem; box-shadow: 0 2px 5px rgba(0,0,0,0.05);"></div>
|
||||
|
||||
<div class="note-context-chat-container flex-grow-1 overflow-auto p-3">
|
||||
<div class="note-context-chat-messages"></div>
|
||||
|
||||
<!-- Thinking display area -->
|
||||
<div class="llm-thinking-container" style="display: none;">
|
||||
<div class="thinking-bubble">
|
||||
<div class="thinking-header d-flex align-items-center">
|
||||
<div class="thinking-dots">
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
</div>
|
||||
<span class="thinking-label ms-2 text-muted small">AI is thinking...</span>
|
||||
<button type="button" class="btn btn-sm btn-link p-0 ms-auto thinking-toggle" title="Toggle thinking details">
|
||||
<i class="bx bx-chevron-down"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="thinking-content" style="display: none;">
|
||||
<div class="thinking-text"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="loading-indicator" style="display: none;">
|
||||
<div class="spinner-border spinner-border-sm text-primary" role="status">
|
||||
<span class="visually-hidden">Loading...</span>
|
||||
</div>
|
||||
<span class="ms-2">${t('ai_llm.agent.processing')}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sources-container p-2 border-top" style="display: none;">
|
||||
<h6 class="m-0 p-1 d-flex align-items-center">
|
||||
<i class="bx bx-link-alt me-1"></i> ${t('ai_llm.sources')}
|
||||
<span class="badge bg-primary rounded-pill ms-2 sources-count"></span>
|
||||
</h6>
|
||||
<div class="sources-list mt-2"></div>
|
||||
</div>
|
||||
|
||||
<form class="note-context-chat-form d-flex flex-column border-top p-2">
|
||||
<div class="d-flex chat-input-container mb-2">
|
||||
<div
|
||||
class="form-control note-context-chat-input flex-grow-1"
|
||||
style="min-height: 60px; max-height: 200px; overflow-y: auto;"
|
||||
data-placeholder="${t('ai_llm.enter_message')}"
|
||||
></div>
|
||||
<button type="submit" class="btn btn-primary note-context-chat-send-button ms-2 d-flex align-items-center justify-content-center">
|
||||
<i class="bx bx-send"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="d-flex align-items-center context-option-container mt-1 justify-content-end">
|
||||
<small class="text-muted me-auto fst-italic">Options:</small>
|
||||
<div class="form-check form-switch me-3 small">
|
||||
<input class="form-check-input use-advanced-context-checkbox" type="checkbox" id="useEnhancedContext" checked>
|
||||
<label class="form-check-label small" for="useEnhancedContext" title="${t('ai.enhanced_context_description')}">
|
||||
${t('ai_llm.use_enhanced_context')}
|
||||
<i class="bx bx-info-circle small text-muted"></i>
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check form-switch small">
|
||||
<input class="form-check-input show-thinking-checkbox" type="checkbox" id="showThinking">
|
||||
<label class="form-check-label small" for="showThinking" title="${t('ai.show_thinking_description')}">
|
||||
${t('ai_llm.show_thinking')}
|
||||
<i class="bx bx-info-circle small text-muted"></i>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
`;
|
||||
|
||||
/**
|
||||
* Add a message to the chat UI
|
||||
*/
|
||||
export function addMessageToChat(messagesContainer: HTMLElement, chatContainer: HTMLElement, role: 'user' | 'assistant', content: string) {
|
||||
const messageElement = document.createElement('div');
|
||||
messageElement.className = `chat-message ${role}-message mb-3 d-flex`;
|
||||
|
||||
const avatarElement = document.createElement('div');
|
||||
avatarElement.className = 'message-avatar d-flex align-items-center justify-content-center me-2';
|
||||
|
||||
if (role === 'user') {
|
||||
avatarElement.innerHTML = '<i class="bx bx-user"></i>';
|
||||
avatarElement.classList.add('user-avatar');
|
||||
} else {
|
||||
avatarElement.innerHTML = '<i class="bx bx-bot"></i>';
|
||||
avatarElement.classList.add('assistant-avatar');
|
||||
}
|
||||
|
||||
const contentElement = document.createElement('div');
|
||||
contentElement.className = 'message-content p-3 rounded flex-grow-1';
|
||||
|
||||
if (role === 'user') {
|
||||
contentElement.classList.add('user-content', 'bg-light');
|
||||
} else {
|
||||
contentElement.classList.add('assistant-content');
|
||||
}
|
||||
|
||||
// Format the content with markdown
|
||||
contentElement.innerHTML = formatMarkdown(content);
|
||||
|
||||
messageElement.appendChild(avatarElement);
|
||||
messageElement.appendChild(contentElement);
|
||||
|
||||
messagesContainer.appendChild(messageElement);
|
||||
|
||||
// Apply syntax highlighting to any code blocks in the message
|
||||
applyHighlighting(contentElement);
|
||||
|
||||
// Scroll to bottom
|
||||
chatContainer.scrollTop = chatContainer.scrollHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show sources in the UI
|
||||
*/
|
||||
export function showSources(
|
||||
sourcesList: HTMLElement,
|
||||
sourcesContainer: HTMLElement,
|
||||
sourcesCount: HTMLElement,
|
||||
sources: Array<{noteId: string, title: string}>,
|
||||
onSourceClick: (noteId: string) => void
|
||||
) {
|
||||
sourcesList.innerHTML = '';
|
||||
sourcesCount.textContent = sources.length.toString();
|
||||
|
||||
sources.forEach(source => {
|
||||
const sourceElement = document.createElement('div');
|
||||
sourceElement.className = 'source-item p-2 mb-1 border rounded d-flex align-items-center';
|
||||
|
||||
// Create the direct link to the note
|
||||
sourceElement.innerHTML = `
|
||||
<div class="d-flex align-items-center w-100">
|
||||
<a href="#root/${source.noteId}"
|
||||
data-note-id="${source.noteId}"
|
||||
class="source-link text-truncate d-flex align-items-center"
|
||||
title="Open note: ${source.title}">
|
||||
<i class="bx bx-file-blank me-1"></i>
|
||||
<span class="source-title">${source.title}</span>
|
||||
</a>
|
||||
</div>`;
|
||||
|
||||
// Add click handler
|
||||
sourceElement.querySelector('.source-link')?.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
onSourceClick(source.noteId);
|
||||
return false;
|
||||
});
|
||||
|
||||
sourcesList.appendChild(sourceElement);
|
||||
});
|
||||
|
||||
sourcesContainer.style.display = 'block';
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide sources in the UI
|
||||
*/
|
||||
export function hideSources(sourcesContainer: HTMLElement) {
|
||||
sourcesContainer.style.display = 'none';
|
||||
}
|
||||
|
||||
/**
|
||||
* Show loading indicator
|
||||
*/
|
||||
export function showLoadingIndicator(loadingIndicator: HTMLElement) {
|
||||
const logId = `ui-${Date.now()}`;
|
||||
console.log(`[${logId}] Showing loading indicator`);
|
||||
|
||||
try {
|
||||
loadingIndicator.style.display = 'flex';
|
||||
const forceUpdate = loadingIndicator.offsetHeight;
|
||||
console.log(`[${logId}] Loading indicator initialized`);
|
||||
} catch (err) {
|
||||
console.error(`[${logId}] Error showing loading indicator:`, err);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide loading indicator
|
||||
*/
|
||||
export function hideLoadingIndicator(loadingIndicator: HTMLElement) {
|
||||
const logId = `ui-${Date.now()}`;
|
||||
console.log(`[${logId}] Hiding loading indicator`);
|
||||
|
||||
try {
|
||||
loadingIndicator.style.display = 'none';
|
||||
const forceUpdate = loadingIndicator.offsetHeight;
|
||||
console.log(`[${logId}] Loading indicator hidden`);
|
||||
} catch (err) {
|
||||
console.error(`[${logId}] Error hiding loading indicator:`, err);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Render tool steps as HTML for display in chat
|
||||
*/
|
||||
export function renderToolStepsHtml(steps: ToolExecutionStep[]): string {
|
||||
if (!steps || steps.length === 0) return '';
|
||||
|
||||
let html = '';
|
||||
|
||||
steps.forEach(step => {
|
||||
let icon, labelClass, content;
|
||||
|
||||
switch (step.type) {
|
||||
case 'executing':
|
||||
icon = 'bx-code-block text-primary';
|
||||
labelClass = '';
|
||||
content = `<div class="d-flex align-items-center">
|
||||
<i class="bx ${icon} me-1"></i>
|
||||
<span>${step.content}</span>
|
||||
</div>`;
|
||||
break;
|
||||
|
||||
case 'result':
|
||||
icon = 'bx-terminal text-success';
|
||||
labelClass = 'fw-bold';
|
||||
content = `<div class="d-flex align-items-center">
|
||||
<i class="bx ${icon} me-1"></i>
|
||||
<span class="${labelClass}">Tool: ${step.name || 'unknown'}</span>
|
||||
</div>
|
||||
<div class="mt-1 ps-3">${step.content}</div>`;
|
||||
break;
|
||||
|
||||
case 'error':
|
||||
icon = 'bx-error-circle text-danger';
|
||||
labelClass = 'fw-bold text-danger';
|
||||
content = `<div class="d-flex align-items-center">
|
||||
<i class="bx ${icon} me-1"></i>
|
||||
<span class="${labelClass}">Tool: ${step.name || 'unknown'}</span>
|
||||
</div>
|
||||
<div class="mt-1 ps-3 text-danger">${step.content}</div>`;
|
||||
break;
|
||||
|
||||
case 'generating':
|
||||
icon = 'bx-message-dots text-info';
|
||||
labelClass = '';
|
||||
content = `<div class="d-flex align-items-center">
|
||||
<i class="bx ${icon} me-1"></i>
|
||||
<span>${step.content}</span>
|
||||
</div>`;
|
||||
break;
|
||||
|
||||
default:
|
||||
icon = 'bx-info-circle text-muted';
|
||||
labelClass = '';
|
||||
content = `<div class="d-flex align-items-center">
|
||||
<i class="bx ${icon} me-1"></i>
|
||||
<span>${step.content}</span>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
html += `<div class="tool-step my-1">${content}</div>`;
|
||||
});
|
||||
|
||||
return html;
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
/**
|
||||
* Utility functions for LLM Chat
|
||||
*/
|
||||
import { marked } from "marked";
|
||||
import { formatCodeBlocks } from "../../services/syntax_highlight.js";
|
||||
|
||||
/**
|
||||
* Format markdown content for display
|
||||
*/
|
||||
export function formatMarkdown(content: string): string {
|
||||
if (!content) return '';
|
||||
|
||||
// First, extract HTML thinking visualization to protect it from replacements
|
||||
const thinkingBlocks: string[] = [];
|
||||
let processedContent = content.replace(/<div class=['"](thinking-process|reasoning-process)['"][\s\S]*?<\/div>/g, (match) => {
|
||||
const placeholder = `__THINKING_BLOCK_${thinkingBlocks.length}__`;
|
||||
thinkingBlocks.push(match);
|
||||
return placeholder;
|
||||
});
|
||||
|
||||
// Use marked library to parse the markdown
|
||||
const markedContent = marked(processedContent, {
|
||||
breaks: true, // Convert line breaks to <br>
|
||||
gfm: true, // Enable GitHub Flavored Markdown
|
||||
silent: true // Ignore errors
|
||||
});
|
||||
|
||||
// Handle potential promise (though it shouldn't be with our options)
|
||||
if (typeof markedContent === 'string') {
|
||||
processedContent = markedContent;
|
||||
} else {
|
||||
console.warn('Marked returned a promise unexpectedly');
|
||||
// Use the original content as fallback
|
||||
processedContent = content;
|
||||
}
|
||||
|
||||
// Restore thinking visualization blocks
|
||||
thinkingBlocks.forEach((block, index) => {
|
||||
processedContent = processedContent.replace(`__THINKING_BLOCK_${index}__`, block);
|
||||
});
|
||||
|
||||
return processedContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple HTML escaping for safer content display
|
||||
*/
|
||||
export function escapeHtml(text: string): string {
|
||||
if (typeof text !== 'string') {
|
||||
text = String(text || '');
|
||||
}
|
||||
|
||||
return text
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''');
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply syntax highlighting to content
|
||||
*/
|
||||
export function applyHighlighting(element: HTMLElement): void {
|
||||
formatCodeBlocks($(element));
|
||||
}
|
||||
|
||||
/**
|
||||
* Format tool arguments for display
|
||||
*/
|
||||
export function formatToolArgs(args: any): string {
|
||||
if (!args || typeof args !== 'object') return '';
|
||||
|
||||
return Object.entries(args)
|
||||
.map(([key, value]) => {
|
||||
// Format the value based on its type
|
||||
let displayValue;
|
||||
if (typeof value === 'string') {
|
||||
displayValue = value.length > 50 ? `"${value.substring(0, 47)}..."` : `"${value}"`;
|
||||
} else if (value === null) {
|
||||
displayValue = 'null';
|
||||
} else if (Array.isArray(value)) {
|
||||
displayValue = '[...]'; // Simplified array representation
|
||||
} else if (typeof value === 'object') {
|
||||
displayValue = '{...}'; // Simplified object representation
|
||||
} else {
|
||||
displayValue = String(value);
|
||||
}
|
||||
|
||||
return `<span class="text-primary">${escapeHtml(key)}</span>: ${escapeHtml(displayValue)}`;
|
||||
})
|
||||
.join(', ');
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
/**
|
||||
* Validation functions for LLM Chat
|
||||
*/
|
||||
import options from "../../services/options.js";
|
||||
import { t } from "../../services/i18n.js";
|
||||
|
||||
/**
|
||||
* Validate providers configuration
|
||||
*/
|
||||
export async function validateProviders(validationWarning: HTMLElement): Promise<void> {
|
||||
try {
|
||||
// Check if AI is enabled
|
||||
const aiEnabled = options.is('aiEnabled');
|
||||
if (!aiEnabled) {
|
||||
validationWarning.style.display = 'none';
|
||||
return;
|
||||
}
|
||||
|
||||
// Get precedence list from options
|
||||
const precedenceStr = options.get('aiProviderPrecedence') || 'openai,anthropic,ollama';
|
||||
let precedenceList: string[] = [];
|
||||
|
||||
if (precedenceStr) {
|
||||
if (precedenceStr.startsWith('[') && precedenceStr.endsWith(']')) {
|
||||
try {
|
||||
precedenceList = JSON.parse(precedenceStr);
|
||||
} catch (e) {
|
||||
console.error('Error parsing precedence list:', e);
|
||||
precedenceList = ['openai']; // Default if parsing fails
|
||||
}
|
||||
} else if (precedenceStr.includes(',')) {
|
||||
precedenceList = precedenceStr.split(',').map(p => p.trim());
|
||||
} else {
|
||||
precedenceList = [precedenceStr];
|
||||
}
|
||||
}
|
||||
|
||||
// Check for configuration issues with providers in the precedence list
|
||||
const configIssues: string[] = [];
|
||||
|
||||
// Always add experimental warning as the first item
|
||||
configIssues.push(t("ai_llm.experimental_warning"));
|
||||
|
||||
// Check each provider in the precedence list for proper configuration
|
||||
for (const provider of precedenceList) {
|
||||
if (provider === 'openai') {
|
||||
// Check OpenAI configuration
|
||||
const apiKey = options.get('openaiApiKey');
|
||||
if (!apiKey) {
|
||||
configIssues.push(`OpenAI API key is missing (optional for OpenAI-compatible endpoints)`);
|
||||
}
|
||||
} else if (provider === 'anthropic') {
|
||||
// Check Anthropic configuration
|
||||
const apiKey = options.get('anthropicApiKey');
|
||||
if (!apiKey) {
|
||||
configIssues.push(`Anthropic API key is missing`);
|
||||
}
|
||||
} else if (provider === 'ollama') {
|
||||
// Check Ollama configuration
|
||||
const baseUrl = options.get('ollamaBaseUrl');
|
||||
if (!baseUrl) {
|
||||
configIssues.push(`Ollama Base URL is missing`);
|
||||
}
|
||||
}
|
||||
// Add checks for other providers as needed
|
||||
}
|
||||
|
||||
// Show warning if there are configuration issues
|
||||
if (configIssues.length > 0) {
|
||||
let message = '<i class="bx bx-error-circle me-2"></i><strong>AI Provider Configuration Issues</strong>';
|
||||
|
||||
message += '<ul class="mb-1 ps-4">';
|
||||
|
||||
// Show configuration issues
|
||||
for (const issue of configIssues) {
|
||||
message += `<li>${issue}</li>`;
|
||||
}
|
||||
|
||||
message += '</ul>';
|
||||
message += '<div class="mt-2"><a href="javascript:" class="settings-link btn btn-sm btn-outline-secondary"><i class="bx bx-cog me-1"></i>Open AI Settings</a></div>';
|
||||
|
||||
// Update HTML content
|
||||
validationWarning.innerHTML = message;
|
||||
validationWarning.style.display = 'block';
|
||||
} else {
|
||||
validationWarning.style.display = 'none';
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error validating providers:', error);
|
||||
validationWarning.style.display = 'none';
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
/**
|
||||
* LLM Chat Panel Widget
|
||||
* This file is preserved for backward compatibility.
|
||||
* The actual implementation has been moved to the llm_chat/ folder.
|
||||
*/
|
||||
import LlmChatPanel from './llm_chat/index.js';
|
||||
export default LlmChatPanel;
|
||||
@@ -12,7 +12,7 @@ import { TypeWidgetProps } from "./type_widgets/type_widget";
|
||||
* A `NoteType` altered by the note detail widget, taking into consideration whether the note is editable or not and adding special note types such as an empty one,
|
||||
* for protected session or attachment information.
|
||||
*/
|
||||
export type ExtendedNoteType = Exclude<NoteType, "launcher" | "text" | "code"> | "empty" | "readOnlyCode" | "readOnlyText" | "editableText" | "editableCode" | "attachmentDetail" | "attachmentList" | "protectedSession" | "aiChat" | "sqlConsole";
|
||||
export type ExtendedNoteType = Exclude<NoteType, "launcher" | "text" | "code"> | "empty" | "readOnlyCode" | "readOnlyText" | "editableText" | "editableCode" | "attachmentDetail" | "attachmentList" | "protectedSession" | "sqlConsole";
|
||||
|
||||
export type TypeWidget = ((props: TypeWidgetProps) => VNode | JSX.Element | undefined);
|
||||
type NoteTypeView = () => (Promise<{ default: TypeWidget } | TypeWidget> | TypeWidget);
|
||||
@@ -137,11 +137,6 @@ export const TYPE_MAPPINGS: Record<ExtendedNoteType, NoteTypeMapping> = {
|
||||
printable: true,
|
||||
isFullHeight: true
|
||||
},
|
||||
aiChat: {
|
||||
view: () => import("./type_widgets/AiChat"),
|
||||
className: "ai-chat-widget-container",
|
||||
isFullHeight: true
|
||||
},
|
||||
sqlConsole: {
|
||||
view: () => import("./type_widgets/SqlConsole"),
|
||||
className: "sql-console-widget-container",
|
||||
|
||||
@@ -85,7 +85,7 @@ export function NoteContextMenu({ note, noteContext, itemsAtStart, itemsNearNote
|
||||
);
|
||||
const isElectron = getIsElectron();
|
||||
const isMac = getIsMac();
|
||||
const hasSource = ["text", "code", "relationMap", "mermaid", "canvas", "mindMap", "aiChat"].includes(noteType);
|
||||
const hasSource = ["text", "code", "relationMap", "mermaid", "canvas", "mindMap"].includes(noteType);
|
||||
const isSearchOrBook = ["search", "book"].includes(noteType);
|
||||
const isHelpPage = note.noteId.startsWith("_help");
|
||||
const [syncServerHost] = useTriliumOption("syncServerHost");
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
import { useEffect, useRef } from "preact/hooks";
|
||||
|
||||
import LlmChatPanel from "../llm_chat";
|
||||
import { useEditorSpacedUpdate, useLegacyWidget } from "../react/hooks";
|
||||
import { type TypeWidgetProps } from "./type_widget";
|
||||
|
||||
export default function AiChat({ note, noteContext }: TypeWidgetProps) {
|
||||
const dataRef = useRef<object>();
|
||||
const spacedUpdate = useEditorSpacedUpdate({
|
||||
note,
|
||||
noteContext,
|
||||
noteType: "aiChat",
|
||||
getData: async () => ({
|
||||
content: JSON.stringify(dataRef.current)
|
||||
}),
|
||||
onContentChange: (newContent) => {
|
||||
try {
|
||||
dataRef.current = JSON.parse(newContent);
|
||||
llmChatPanel.refresh();
|
||||
} catch (e) {
|
||||
dataRef.current = {};
|
||||
}
|
||||
}
|
||||
});
|
||||
const [ ChatWidget, llmChatPanel ] = useLegacyWidget(() => {
|
||||
const llmChatPanel = new LlmChatPanel();
|
||||
llmChatPanel.setDataCallbacks(
|
||||
async (data) => {
|
||||
dataRef.current = data;
|
||||
spacedUpdate.scheduleUpdate();
|
||||
},
|
||||
async () => dataRef.current
|
||||
);
|
||||
return llmChatPanel;
|
||||
}, {
|
||||
noteContext,
|
||||
containerStyle: {
|
||||
height: "100%"
|
||||
}
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
llmChatPanel.setNoteId(note.noteId);
|
||||
llmChatPanel.setCurrentNoteId(note.noteId);
|
||||
}, [ note ]);
|
||||
|
||||
return ChatWidget;
|
||||
}
|
||||
@@ -11,7 +11,6 @@ import MultiFactorAuthenticationSettings from "./options/multi_factor_authentica
|
||||
import EtapiSettings from "./options/etapi";
|
||||
import BackupSettings from "./options/backup";
|
||||
import SyncOptions from "./options/sync";
|
||||
import AiSettings from "./options/ai_settings";
|
||||
import OtherSettings from "./options/other";
|
||||
import InternationalizationOptions from "./options/i18n";
|
||||
import AdvancedSettings from "./options/advanced";
|
||||
@@ -19,7 +18,7 @@ import "./ContentWidget.css";
|
||||
import { t } from "../../services/i18n";
|
||||
import BackendLog from "./code/BackendLog";
|
||||
|
||||
export type OptionPages = "_optionsAppearance" | "_optionsShortcuts" | "_optionsTextNotes" | "_optionsCodeNotes" | "_optionsImages" | "_optionsSpellcheck" | "_optionsPassword" | "_optionsMFA" | "_optionsEtapi" | "_optionsBackup" | "_optionsSync" | "_optionsAi" | "_optionsOther" | "_optionsLocalization" | "_optionsAdvanced";
|
||||
export type OptionPages = "_optionsAppearance" | "_optionsShortcuts" | "_optionsTextNotes" | "_optionsCodeNotes" | "_optionsImages" | "_optionsSpellcheck" | "_optionsPassword" | "_optionsMFA" | "_optionsEtapi" | "_optionsBackup" | "_optionsSync" | "_optionsOther" | "_optionsLocalization" | "_optionsAdvanced";
|
||||
|
||||
const CONTENT_WIDGETS: Record<OptionPages | "_backendLog", (props: TypeWidgetProps) => JSX.Element> = {
|
||||
_optionsAppearance: AppearanceSettings,
|
||||
@@ -33,7 +32,6 @@ const CONTENT_WIDGETS: Record<OptionPages | "_backendLog", (props: TypeWidgetPro
|
||||
_optionsEtapi: EtapiSettings,
|
||||
_optionsBackup: BackupSettings,
|
||||
_optionsSync: SyncOptions,
|
||||
_optionsAi: AiSettings,
|
||||
_optionsOther: OtherSettings,
|
||||
_optionsLocalization: InternationalizationOptions,
|
||||
_optionsAdvanced: AdvancedSettings,
|
||||
|
||||
@@ -1,236 +0,0 @@
|
||||
import { useCallback, useEffect, useState } from "preact/hooks";
|
||||
import { t } from "../../../services/i18n";
|
||||
import toast from "../../../services/toast";
|
||||
import FormCheckbox from "../../react/FormCheckbox";
|
||||
import FormGroup from "../../react/FormGroup";
|
||||
import { useTriliumOption, useTriliumOptionBool } from "../../react/hooks";
|
||||
import OptionsSection from "./components/OptionsSection";
|
||||
import Admonition from "../../react/Admonition";
|
||||
import FormSelect from "../../react/FormSelect";
|
||||
import FormTextBox from "../../react/FormTextBox";
|
||||
import type { OllamaModelResponse, OpenAiOrAnthropicModelResponse, OptionNames } from "@triliumnext/commons";
|
||||
import server from "../../../services/server";
|
||||
import Button from "../../react/Button";
|
||||
import FormTextArea from "../../react/FormTextArea";
|
||||
|
||||
export default function AiSettings() {
|
||||
return (
|
||||
<>
|
||||
<EnableAiSettings />
|
||||
<ProviderSettings />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function EnableAiSettings() {
|
||||
const [ aiEnabled, setAiEnabled ] = useTriliumOptionBool("aiEnabled");
|
||||
|
||||
return (
|
||||
<>
|
||||
<OptionsSection title={t("ai_llm.title")}>
|
||||
<FormGroup name="ai-enabled" description={t("ai_llm.enable_ai_description")}>
|
||||
<FormCheckbox
|
||||
label={t("ai_llm.enable_ai_features")}
|
||||
currentValue={aiEnabled} onChange={(isEnabled) => {
|
||||
if (isEnabled) {
|
||||
toast.showMessage(t("ai_llm.ai_enabled"));
|
||||
} else {
|
||||
toast.showMessage(t("ai_llm.ai_disabled"));
|
||||
}
|
||||
|
||||
setAiEnabled(isEnabled);
|
||||
}}
|
||||
/>
|
||||
</FormGroup>
|
||||
{aiEnabled && <Admonition type="warning">{t("ai_llm.experimental_warning")}</Admonition>}
|
||||
</OptionsSection>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function ProviderSettings() {
|
||||
const [ aiSelectedProvider, setAiSelectedProvider ] = useTriliumOption("aiSelectedProvider");
|
||||
const [ aiTemperature, setAiTemperature ] = useTriliumOption("aiTemperature");
|
||||
const [ aiSystemPrompt, setAiSystemPrompt ] = useTriliumOption("aiSystemPrompt");
|
||||
|
||||
return (
|
||||
<OptionsSection title={t("ai_llm.provider_configuration")}>
|
||||
<FormGroup name="selected-provider" label={t("ai_llm.selected_provider")} description={t("ai_llm.selected_provider_description")}>
|
||||
<FormSelect
|
||||
values={[
|
||||
{ value: "", text: t("ai_llm.select_provider") },
|
||||
{ value: "openai", text: "OpenAI" },
|
||||
{ value: "anthropic", text: "Anthropic" },
|
||||
{ value: "ollama", text: "Ollama" }
|
||||
]}
|
||||
currentValue={aiSelectedProvider} onChange={setAiSelectedProvider}
|
||||
keyProperty="value" titleProperty="text"
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
{
|
||||
aiSelectedProvider === "openai" ?
|
||||
<SingleProviderSettings
|
||||
title={t("ai_llm.openai_settings")}
|
||||
apiKeyDescription={t("ai_llm.openai_api_key_description")}
|
||||
baseUrlDescription={t("ai_llm.openai_url_description")}
|
||||
modelDescription={t("ai_llm.openai_model_description")}
|
||||
validationErrorMessage={t("ai_llm.empty_key_warning.openai")}
|
||||
apiKeyOption="openaiApiKey" baseUrlOption="openaiBaseUrl" modelOption="openaiDefaultModel"
|
||||
provider={aiSelectedProvider}
|
||||
/>
|
||||
: aiSelectedProvider === "anthropic" ?
|
||||
<SingleProviderSettings
|
||||
title={t("ai_llm.anthropic_settings")}
|
||||
apiKeyDescription={t("ai_llm.anthropic_api_key_description")}
|
||||
modelDescription={t("ai_llm.anthropic_model_description")}
|
||||
baseUrlDescription={t("ai_llm.anthropic_url_description")}
|
||||
validationErrorMessage={t("ai_llm.empty_key_warning.anthropic")}
|
||||
apiKeyOption="anthropicApiKey" baseUrlOption="anthropicBaseUrl" modelOption="anthropicDefaultModel"
|
||||
provider={aiSelectedProvider}
|
||||
/>
|
||||
: aiSelectedProvider === "ollama" ?
|
||||
<SingleProviderSettings
|
||||
title={t("ai_llm.ollama_settings")}
|
||||
baseUrlDescription={t("ai_llm.ollama_url_description")}
|
||||
modelDescription={t("ai_llm.ollama_model_description")}
|
||||
validationErrorMessage={t("ai_llm.ollama_no_url")}
|
||||
baseUrlOption="ollamaBaseUrl"
|
||||
provider={aiSelectedProvider} modelOption="ollamaDefaultModel"
|
||||
/>
|
||||
:
|
||||
<></>
|
||||
}
|
||||
|
||||
<FormGroup name="ai-temperature" label={t("ai_llm.temperature")} description={t("ai_llm.temperature_description")}>
|
||||
<FormTextBox
|
||||
type="number" min="0" max="2" step="0.1"
|
||||
currentValue={aiTemperature} onChange={setAiTemperature}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup name="system-prompt" label={t("ai_llm.system_prompt")} description={t("ai_llm.system_prompt_description")}>
|
||||
<FormTextArea
|
||||
rows={3}
|
||||
currentValue={aiSystemPrompt} onBlur={setAiSystemPrompt}
|
||||
/>
|
||||
</FormGroup>
|
||||
</OptionsSection>
|
||||
)
|
||||
}
|
||||
|
||||
interface SingleProviderSettingsProps {
|
||||
provider: string;
|
||||
title: string;
|
||||
apiKeyDescription?: string;
|
||||
baseUrlDescription: string;
|
||||
modelDescription: string;
|
||||
validationErrorMessage: string;
|
||||
apiKeyOption?: OptionNames;
|
||||
baseUrlOption: OptionNames;
|
||||
modelOption: OptionNames;
|
||||
}
|
||||
|
||||
function SingleProviderSettings({ provider, title, apiKeyDescription, baseUrlDescription, modelDescription, validationErrorMessage, apiKeyOption, baseUrlOption, modelOption }: SingleProviderSettingsProps) {
|
||||
const [ apiKey, setApiKey ] = useTriliumOption(apiKeyOption ?? baseUrlOption);
|
||||
const [ baseUrl, setBaseUrl ] = useTriliumOption(baseUrlOption);
|
||||
const isValid = (apiKeyOption ? !!apiKey : !!baseUrl);
|
||||
|
||||
return (
|
||||
<div class="provider-settings">
|
||||
<div class="card mt-3">
|
||||
<div class="card-header">
|
||||
<h5>{title}</h5>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
{!isValid && <Admonition type="caution">{validationErrorMessage}</Admonition> }
|
||||
|
||||
{apiKeyOption && (
|
||||
<FormGroup name="api-key" label={t("ai_llm.api_key")} description={apiKeyDescription}>
|
||||
<FormTextBox
|
||||
type="password" autoComplete="off"
|
||||
currentValue={apiKey} onChange={setApiKey}
|
||||
/>
|
||||
</FormGroup>
|
||||
)}
|
||||
|
||||
<FormGroup name="base-url" label={t("ai_llm.url")} description={baseUrlDescription}>
|
||||
<FormTextBox
|
||||
currentValue={baseUrl ?? "https://api.openai.com/v1"} onChange={setBaseUrl}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
{isValid &&
|
||||
<FormGroup name="model" label={t("ai_llm.model")} description={modelDescription}>
|
||||
<ModelSelector provider={provider} baseUrl={baseUrl} modelOption={modelOption} />
|
||||
</FormGroup>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function ModelSelector({ provider, baseUrl, modelOption }: { provider: string; baseUrl: string, modelOption: OptionNames }) {
|
||||
const [ model, setModel ] = useTriliumOption(modelOption);
|
||||
const [ models, setModels ] = useState<{ name: string, id: string }[]>([]);
|
||||
|
||||
const loadProviders = useCallback(async () => {
|
||||
switch (provider) {
|
||||
case "openai":
|
||||
case "anthropic": {
|
||||
try {
|
||||
const response = await server.get<OpenAiOrAnthropicModelResponse>(`llm/providers/${provider}/models?baseUrl=${encodeURIComponent(baseUrl)}`);
|
||||
if (response.success) {
|
||||
setModels(response.chatModels.toSorted((a, b) => a.name.localeCompare(b.name)));
|
||||
} else {
|
||||
toast.showError(t("ai_llm.no_models_found_online"));
|
||||
}
|
||||
} catch (e) {
|
||||
toast.showError(t("ai_llm.error_fetching", { error: e }));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "ollama": {
|
||||
try {
|
||||
const response = await server.get<OllamaModelResponse>(`llm/providers/ollama/models?baseUrl=${encodeURIComponent(baseUrl)}`);
|
||||
if (response.success) {
|
||||
setModels(response.models
|
||||
.map(model => ({
|
||||
name: model.name,
|
||||
id: model.model
|
||||
}))
|
||||
.toSorted((a, b) => a.name.localeCompare(b.name)));
|
||||
} else {
|
||||
toast.showError(t("ai_llm.no_models_found_ollama"));
|
||||
}
|
||||
} catch (e) {
|
||||
toast.showError(t("ai_llm.error_fetching", { error: e }));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}, [provider]);
|
||||
|
||||
useEffect(() => {
|
||||
loadProviders();
|
||||
}, [provider]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<FormSelect
|
||||
values={models}
|
||||
keyProperty="id" titleProperty="name"
|
||||
currentValue={model} onChange={setModel}
|
||||
/>
|
||||
|
||||
<Button
|
||||
text={t("ai_llm.refresh_models")}
|
||||
onClick={loadProviders}
|
||||
size="small"
|
||||
style={{ marginTop: "0.5em" }}
|
||||
/>
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -1,177 +0,0 @@
|
||||
import { test, expect } from "@playwright/test";
|
||||
import App from "./support/app";
|
||||
|
||||
test.describe("AI Settings", () => {
|
||||
test("Should access settings page", async ({ page, context }) => {
|
||||
page.setDefaultTimeout(15_000);
|
||||
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
// Go to settings
|
||||
await app.goToSettings();
|
||||
|
||||
// Wait for navigation to complete
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
// Verify we're in settings by checking for common settings elements
|
||||
const settingsElements = page.locator('.note-split, .options-section, .component');
|
||||
await expect(settingsElements.first()).toBeVisible({ timeout: 10000 });
|
||||
|
||||
// Look for any content in the main area
|
||||
const mainContent = page.locator('.note-split:not(.hidden-ext)');
|
||||
await expect(mainContent).toBeVisible();
|
||||
|
||||
// Basic test passes - settings are accessible
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
|
||||
test("Should handle AI features if available", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
await app.goToSettings();
|
||||
|
||||
// Look for AI-related elements anywhere in settings
|
||||
const aiElements = page.locator('[class*="ai-"], [data-option*="ai"], input[name*="ai"]');
|
||||
const aiElementsCount = await aiElements.count();
|
||||
|
||||
if (aiElementsCount > 0) {
|
||||
// AI features are present, test basic interaction
|
||||
const firstAiElement = aiElements.first();
|
||||
await expect(firstAiElement).toBeVisible();
|
||||
|
||||
// If it's a checkbox, test toggling
|
||||
const elementType = await firstAiElement.getAttribute('type');
|
||||
if (elementType === 'checkbox') {
|
||||
const initialState = await firstAiElement.isChecked();
|
||||
await firstAiElement.click();
|
||||
|
||||
// Wait a moment for any async operations
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
const newState = await firstAiElement.isChecked();
|
||||
expect(newState).toBe(!initialState);
|
||||
|
||||
// Restore original state
|
||||
await firstAiElement.click();
|
||||
await page.waitForTimeout(500);
|
||||
}
|
||||
} else {
|
||||
// AI features not available - this is acceptable in test environment
|
||||
console.log("AI features not found in settings - this may be expected in test environment");
|
||||
}
|
||||
|
||||
// Test always passes - we're just checking if AI features work when present
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
|
||||
test("Should handle AI provider configuration if available", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
await app.goToSettings();
|
||||
|
||||
// Look for provider-related selects or inputs
|
||||
const providerSelects = page.locator('select[class*="provider"], select[name*="provider"]');
|
||||
const apiKeyInputs = page.locator('input[type="password"][class*="api"], input[type="password"][name*="key"]');
|
||||
|
||||
const hasProviderConfig = await providerSelects.count() > 0 || await apiKeyInputs.count() > 0;
|
||||
|
||||
if (hasProviderConfig) {
|
||||
// Provider configuration is available
|
||||
if (await providerSelects.count() > 0) {
|
||||
const firstSelect = providerSelects.first();
|
||||
await expect(firstSelect).toBeVisible();
|
||||
|
||||
// Test selecting different options if available
|
||||
const options = await firstSelect.locator('option').count();
|
||||
if (options > 1) {
|
||||
const firstOptionValue = await firstSelect.locator('option').nth(1).getAttribute('value');
|
||||
if (firstOptionValue) {
|
||||
await firstSelect.selectOption(firstOptionValue);
|
||||
await expect(firstSelect).toHaveValue(firstOptionValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (await apiKeyInputs.count() > 0) {
|
||||
const firstApiKeyInput = apiKeyInputs.first();
|
||||
await expect(firstApiKeyInput).toBeVisible();
|
||||
|
||||
// Test input functionality (without actually setting sensitive data)
|
||||
await firstApiKeyInput.fill('test-key-placeholder');
|
||||
await expect(firstApiKeyInput).toHaveValue('test-key-placeholder');
|
||||
|
||||
// Clear the test value
|
||||
await firstApiKeyInput.fill('');
|
||||
}
|
||||
} else {
|
||||
console.log("AI provider configuration not found - this may be expected in test environment");
|
||||
}
|
||||
|
||||
// Test always passes
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
|
||||
test("Should handle model configuration if available", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
await app.goToSettings();
|
||||
|
||||
// Look for model-related configuration
|
||||
const modelSelects = page.locator('select[class*="model"], select[name*="model"]');
|
||||
const temperatureInputs = page.locator('input[name*="temperature"], input[class*="temperature"]');
|
||||
|
||||
if (await modelSelects.count() > 0) {
|
||||
const firstModelSelect = modelSelects.first();
|
||||
await expect(firstModelSelect).toBeVisible();
|
||||
}
|
||||
|
||||
if (await temperatureInputs.count() > 0) {
|
||||
const temperatureInput = temperatureInputs.first();
|
||||
await expect(temperatureInput).toBeVisible();
|
||||
|
||||
// Test temperature setting (common AI parameter)
|
||||
await temperatureInput.fill('0.7');
|
||||
await expect(temperatureInput).toHaveValue('0.7');
|
||||
}
|
||||
|
||||
// Test always passes
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
|
||||
test("Should display settings interface correctly", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
await app.goToSettings();
|
||||
|
||||
// Wait for navigation to complete
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
// Verify basic settings interface elements exist
|
||||
const mainContent = page.locator('.note-split:not(.hidden-ext)');
|
||||
await expect(mainContent).toBeVisible({ timeout: 10000 });
|
||||
|
||||
// Look for common settings elements
|
||||
const forms = page.locator('form, .form-group, .options-section, .component');
|
||||
const inputs = page.locator('input, select, textarea');
|
||||
const labels = page.locator('label, .form-label');
|
||||
|
||||
// Wait for content to load
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Settings should have some form elements or components
|
||||
const formCount = await forms.count();
|
||||
const inputCount = await inputs.count();
|
||||
const labelCount = await labels.count();
|
||||
|
||||
// At least one of these should be present in settings
|
||||
expect(formCount + inputCount + labelCount).toBeGreaterThan(0);
|
||||
|
||||
// Basic UI structure test passes
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -9,6 +9,8 @@ test("Can duplicate note with broken links", async ({ page, context }) => {
|
||||
|
||||
await app.noteTree.getByText("Note map").first().click({ button: "right" });
|
||||
await page.locator("#context-menu-container").getByText("Duplicate").click();
|
||||
await expect(page.locator(".toast-body")).toBeHidden();
|
||||
await expect(app.noteTree.getByText("Note map (dup)")).toBeVisible();
|
||||
await expect(page.locator(".toast-body", {
|
||||
hasText: `Note "Note map" has been`
|
||||
})).toBeHidden();
|
||||
await expect(app.noteTree.getByText("Note map (dup)").first()).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -1,216 +0,0 @@
|
||||
import { test, expect } from "@playwright/test";
|
||||
import App from "./support/app";
|
||||
|
||||
test.describe("LLM Chat Features", () => {
|
||||
test("Should handle basic navigation", async ({ page, context }) => {
|
||||
page.setDefaultTimeout(15_000);
|
||||
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
// Basic navigation test - verify the app loads
|
||||
await expect(app.currentNoteSplit).toBeVisible();
|
||||
await expect(app.noteTree).toBeVisible();
|
||||
|
||||
// Test passes if basic interface is working
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
|
||||
test("Should look for LLM/AI features in the interface", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
// Look for any AI/LLM related elements in the interface
|
||||
const aiElements = page.locator('[class*="ai"], [class*="llm"], [class*="chat"], [data-*="ai"], [data-*="llm"]');
|
||||
const aiElementsCount = await aiElements.count();
|
||||
|
||||
if (aiElementsCount > 0) {
|
||||
console.log(`Found ${aiElementsCount} AI/LLM related elements in the interface`);
|
||||
|
||||
// If AI elements exist, verify they are in the DOM
|
||||
const firstAiElement = aiElements.first();
|
||||
expect(await firstAiElement.count()).toBeGreaterThan(0);
|
||||
} else {
|
||||
console.log("No AI/LLM elements found - this may be expected in test environment");
|
||||
}
|
||||
|
||||
// Test always passes - we're just checking for presence
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
|
||||
test("Should handle launcher functionality", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
// Test the launcher bar functionality
|
||||
await expect(app.launcherBar).toBeVisible();
|
||||
|
||||
// Look for any buttons in the launcher
|
||||
const launcherButtons = app.launcherBar.locator('.launcher-button');
|
||||
const buttonCount = await launcherButtons.count();
|
||||
|
||||
if (buttonCount > 0) {
|
||||
// Try clicking the first launcher button
|
||||
const firstButton = launcherButtons.first();
|
||||
await expect(firstButton).toBeVisible();
|
||||
|
||||
// Click and verify some response
|
||||
await firstButton.click();
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
// Verify the interface is still responsive
|
||||
await expect(app.currentNoteSplit).toBeVisible();
|
||||
}
|
||||
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
|
||||
test("Should handle note creation", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
// Verify basic UI is loaded
|
||||
await expect(app.noteTree).toBeVisible();
|
||||
|
||||
// Get initial tab count
|
||||
const initialTabCount = await app.tabBar.locator('.note-tab-wrapper').count();
|
||||
|
||||
// Try to add a new tab using the UI button
|
||||
try {
|
||||
await app.addNewTab();
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
// Verify a new tab was created
|
||||
const newTabCount = await app.tabBar.locator('.note-tab-wrapper').count();
|
||||
expect(newTabCount).toBeGreaterThan(initialTabCount);
|
||||
|
||||
// The new tab should have focus, so we can test if we can interact with any note
|
||||
// Instead of trying to find a hidden title input, let's just verify the tab system works
|
||||
const activeTab = await app.getActiveTab();
|
||||
await expect(activeTab).toBeVisible();
|
||||
|
||||
console.log("Successfully created a new tab");
|
||||
} catch (error) {
|
||||
console.log("Could not create new tab, but basic navigation works");
|
||||
// Even if tab creation fails, the test passes if basic navigation works
|
||||
await expect(app.noteTree).toBeVisible();
|
||||
await expect(app.launcherBar).toBeVisible();
|
||||
}
|
||||
});
|
||||
|
||||
test("Should handle search functionality", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
// Look for the search input specifically (based on the quick_search.ts template)
|
||||
const searchInputs = page.locator('.quick-search .search-string');
|
||||
const count = await searchInputs.count();
|
||||
|
||||
// The search widget might be hidden by default on some layouts
|
||||
if (count > 0) {
|
||||
// Use the first visible search input
|
||||
const searchInput = searchInputs.first();
|
||||
|
||||
if (await searchInput.isVisible()) {
|
||||
// Test search input
|
||||
await searchInput.fill('test search');
|
||||
await expect(searchInput).toHaveValue('test search');
|
||||
|
||||
// Clear search
|
||||
await searchInput.fill('');
|
||||
} else {
|
||||
console.log("Search input not visible in current layout");
|
||||
}
|
||||
} else {
|
||||
// Skip test if search is not visible
|
||||
console.log("No search inputs found in current layout");
|
||||
}
|
||||
});
|
||||
|
||||
test("Should handle basic interface interactions", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
// Test that the interface responds to basic interactions
|
||||
await expect(app.currentNoteSplit).toBeVisible();
|
||||
await expect(app.noteTree).toBeVisible();
|
||||
|
||||
// Test clicking on note tree
|
||||
const noteTreeItems = app.noteTree.locator('.fancytree-node');
|
||||
const itemCount = await noteTreeItems.count();
|
||||
|
||||
if (itemCount > 0) {
|
||||
// Click on a note tree item
|
||||
const firstItem = noteTreeItems.first();
|
||||
await firstItem.click();
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
// Verify the interface is still responsive
|
||||
await expect(app.currentNoteSplit).toBeVisible();
|
||||
}
|
||||
|
||||
// Test keyboard navigation
|
||||
await page.keyboard.press('ArrowDown');
|
||||
await page.waitForTimeout(100);
|
||||
await page.keyboard.press('ArrowUp');
|
||||
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
|
||||
test("Should handle LLM panel if available", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
// Look for LLM chat panel elements
|
||||
const llmPanel = page.locator('.note-context-chat-container, .llm-chat-panel');
|
||||
|
||||
if (await llmPanel.count() > 0 && await llmPanel.isVisible()) {
|
||||
// Check for chat input
|
||||
const chatInput = page.locator('.note-context-chat-input');
|
||||
await expect(chatInput).toBeVisible();
|
||||
|
||||
// Check for send button
|
||||
const sendButton = page.locator('.note-context-chat-send-button');
|
||||
await expect(sendButton).toBeVisible();
|
||||
|
||||
// Check for chat messages area
|
||||
const messagesArea = page.locator('.note-context-chat-messages');
|
||||
await expect(messagesArea).toBeVisible();
|
||||
} else {
|
||||
console.log("LLM chat panel not visible in current view");
|
||||
}
|
||||
});
|
||||
|
||||
test("Should navigate to AI settings if needed", async ({ page, context }) => {
|
||||
const app = new App(page, context);
|
||||
await app.goto();
|
||||
|
||||
// Navigate to settings first
|
||||
await app.goToSettings();
|
||||
|
||||
// Wait for settings to load
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Try to navigate to AI settings using the URL
|
||||
await page.goto('#root/_hidden/_options/_optionsAi');
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
// Check if we're in some kind of settings page (more flexible check)
|
||||
const settingsContent = page.locator('.note-split:not(.hidden-ext)');
|
||||
await expect(settingsContent).toBeVisible({ timeout: 10000 });
|
||||
|
||||
// Look for AI/LLM related content or just verify we're in settings
|
||||
const hasAiContent = await page.locator('text="AI"').count() > 0 ||
|
||||
await page.locator('text="LLM"').count() > 0 ||
|
||||
await page.locator('text="AI features"').count() > 0;
|
||||
|
||||
if (hasAiContent) {
|
||||
console.log("Successfully found AI-related settings");
|
||||
} else {
|
||||
console.log("AI settings may not be configured, but navigation to settings works");
|
||||
}
|
||||
|
||||
// Test passes if we can navigate to settings area
|
||||
expect(true).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -35,7 +35,6 @@
|
||||
"sucrase": "3.35.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@anthropic-ai/sdk": "0.78.0",
|
||||
"@braintree/sanitize-url": "7.1.2",
|
||||
"@electron/remote": "2.1.3",
|
||||
"@triliumnext/commons": "workspace:*",
|
||||
@@ -111,8 +110,6 @@
|
||||
"mime-types": "3.0.2",
|
||||
"multer": "2.0.2",
|
||||
"normalize-strings": "1.1.1",
|
||||
"ollama": "0.6.3",
|
||||
"openai": "6.22.0",
|
||||
"rand-token": "1.0.1",
|
||||
"safe-compare": "1.1.4",
|
||||
"sanitize-filename": "1.6.3",
|
||||
|
||||
2
apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json
generated
vendored
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/1_AI_image.png
generated
vendored
|
Before Width: | Height: | Size: 168 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/2_AI_image.png
generated
vendored
|
Before Width: | Height: | Size: 43 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/3_AI_image.png
generated
vendored
|
Before Width: | Height: | Size: 172 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/4_AI_image.png
generated
vendored
|
Before Width: | Height: | Size: 167 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/5_AI_image.png
generated
vendored
|
Before Width: | Height: | Size: 237 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/6_AI_image.png
generated
vendored
|
Before Width: | Height: | Size: 202 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/7_AI_image.png
generated
vendored
|
Before Width: | Height: | Size: 49 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/8_AI_image.png
generated
vendored
|
Before Width: | Height: | Size: 80 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/9_AI_image.png
generated
vendored
|
Before Width: | Height: | Size: 191 KiB |
190
apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI.html
generated
vendored
@@ -1,162 +1,28 @@
|
||||
<figure class="image image_resized" style="width:63.68%;">
|
||||
<img style="aspect-ratio:1363/1364;" src="AI_image.png"
|
||||
width="1363" height="1364">
|
||||
<figcaption>An example chat with an LLM</figcaption>
|
||||
</figure>
|
||||
<p>The AI / LLM features within Trilium Notes are designed to allow you to
|
||||
interact with your Notes in a variety of ways, using as many of the major
|
||||
providers as we can support. </p>
|
||||
<p>In addition to being able to send chats to LLM providers such as OpenAI,
|
||||
Anthropic, and Ollama - we also support agentic tool calling, and embeddings.</p>
|
||||
<p>The quickest way to get started is to navigate to the “AI/LLM” settings:</p>
|
||||
<figure
|
||||
class="image image_resized" style="width:74.04%;">
|
||||
<img style="aspect-ratio:1916/1906;" src="5_AI_image.png"
|
||||
width="1916" height="1906">
|
||||
</figure>
|
||||
<p>Enable the feature:</p>
|
||||
<figure class="image image_resized" style="width:82.82%;">
|
||||
<img style="aspect-ratio:1911/997;" src="1_AI_image.png"
|
||||
width="1911" height="997">
|
||||
</figure>
|
||||
|
||||
<h2>Embeddings</h2>
|
||||
<p><strong>Embeddings</strong> are important as it allows us to have an compact
|
||||
AI “summary” (it's not human readable text) of each of your Notes, that
|
||||
we can then perform mathematical functions on (such as cosine similarity)
|
||||
to smartly figure out which Notes to send as context to the LLM when you're
|
||||
chatting, among other useful functions.</p>
|
||||
<p>You will then need to set up the AI “provider” that you wish to use to
|
||||
create the embeddings for your Notes. Currently OpenAI, Voyage AI, and
|
||||
Ollama are supported providers for embedding generation.</p>
|
||||
<p>In the following example, we're going to use our self-hosted Ollama instance
|
||||
to create the embeddings for our Notes. You can see additional documentation
|
||||
about installing your own Ollama locally in <a class="reference-link"
|
||||
href="#root/_help_vvUCN7FDkq7G">Installing Ollama</a>.</p>
|
||||
<p>To see what embedding models Ollama has available, you can check out
|
||||
<a
|
||||
href="https://ollama.com/search?c=embedding">this search</a>on their website, and then <code spellcheck="false">pull</code> whichever
|
||||
one you want to try out. A popular choice is <code spellcheck="false">mxbai-embed-large</code>.</p>
|
||||
<p>First, we'll need to select the Ollama provider from the tabs of providers,
|
||||
then we will enter in the Base URL for our Ollama. Since our Ollama is
|
||||
running on our local machine, our Base URL is <code spellcheck="false">http://localhost:11434</code>.
|
||||
We will then hit the “refresh” button to have it fetch our models:</p>
|
||||
<figure
|
||||
class="image image_resized" style="width:82.28%;">
|
||||
<img style="aspect-ratio:1912/1075;" src="4_AI_image.png"
|
||||
width="1912" height="1075">
|
||||
</figure>
|
||||
<p>When selecting the dropdown for the “Embedding Model”, embedding models
|
||||
should be at the top of the list, separated by regular chat models with
|
||||
a horizontal line, as seen below:</p>
|
||||
<figure class="image image_resized"
|
||||
style="width:61.73%;">
|
||||
<img style="aspect-ratio:1232/959;" src="8_AI_image.png"
|
||||
width="1232" height="959">
|
||||
</figure>
|
||||
<p>After selecting an embedding model, embeddings should automatically begin
|
||||
to be generated by checking the embedding statistics at the top of the
|
||||
“AI/LLM” settings panel:</p>
|
||||
<figure class="image image_resized" style="width:67.06%;">
|
||||
<img style="aspect-ratio:1333/499;" src="7_AI_image.png"
|
||||
width="1333" height="499">
|
||||
</figure>
|
||||
<p>If you don't see any embeddings being created, you will want to scroll
|
||||
to the bottom of the settings, and hit “Recreate All Embeddings”:</p>
|
||||
<figure
|
||||
class="image image_resized" style="width:65.69%;">
|
||||
<img style="aspect-ratio:1337/1490;" src="3_AI_image.png"
|
||||
width="1337" height="1490">
|
||||
</figure>
|
||||
<p>Creating the embeddings will take some time, and will be regenerated when
|
||||
a Note is created, updated, or deleted (removed).</p>
|
||||
<p>If for some reason you choose to change your embedding provider, or the
|
||||
model used, you'll need to recreate all embeddings.</p>
|
||||
<h2>Tools</h2>
|
||||
<p>Tools are essentially functions that we provide to the various LLM providers,
|
||||
and then LLMs can respond in a specific format that tells us what tool
|
||||
function and parameters they would like to invoke. We then execute these
|
||||
tools, and provide it as additional context in the Chat conversation. </p>
|
||||
<p>These are the tools that currently exist, and will certainly be updated
|
||||
to be more effectively (and even more to be added!):</p>
|
||||
<ul>
|
||||
<li><code spellcheck="false">search_notes</code>
|
||||
<ul>
|
||||
<li>Semantic search</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code spellcheck="false">keyword_search</code>
|
||||
<ul>
|
||||
<li>Keyword-based search</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code spellcheck="false">attribute_search</code>
|
||||
<ul>
|
||||
<li>Attribute-specific search</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code spellcheck="false">search_suggestion</code>
|
||||
<ul>
|
||||
<li>Search syntax helper</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code spellcheck="false">read_note</code>
|
||||
<ul>
|
||||
<li>Read note content (helps the LLM read Notes)</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code spellcheck="false">create_note</code>
|
||||
<ul>
|
||||
<li>Create a Note</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code spellcheck="false">update_note</code>
|
||||
<ul>
|
||||
<li>Update a Note</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code spellcheck="false">manage_attributes</code>
|
||||
<ul>
|
||||
<li>Manage attributes on a Note</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code spellcheck="false">manage_relationships</code>
|
||||
<ul>
|
||||
<li>Manage the various relationships between Notes</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code spellcheck="false">extract_content</code>
|
||||
<ul>
|
||||
<li>Used to smartly extract content from a Note</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><code spellcheck="false">calendar_integration</code>
|
||||
<ul>
|
||||
<li>Used to find date notes, create date notes, get the daily note, etc.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>When Tools are executed within your Chat, you'll see output like the following:</p>
|
||||
<figure
|
||||
class="image image_resized" style="width:66.88%;">
|
||||
<img style="aspect-ratio:1372/1591;" src="6_AI_image.png"
|
||||
width="1372" height="1591">
|
||||
</figure>
|
||||
<p>You don't need to tell the LLM to execute a certain tool, it should “smartly”
|
||||
call tools and automatically execute them as needed.</p>
|
||||
<h2>Overview</h2>
|
||||
<p>To start, simply press the <em>Chat with Notes</em> button in the
|
||||
<a
|
||||
class="reference-link" href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>.</p>
|
||||
<figure class="image image_resized" style="width:60.77%;">
|
||||
<img style="aspect-ratio:1378/539;" src="2_AI_image.png"
|
||||
width="1378" height="539">
|
||||
</figure>
|
||||
<p>If you don't see the button in the <a class="reference-link" href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>,
|
||||
you might need to move it from the <em>Available Launchers</em> section to
|
||||
the <em>Visible Launchers</em> section:</p>
|
||||
<figure class="image image_resized"
|
||||
style="width:69.81%;">
|
||||
<img style="aspect-ratio:1765/1287;" src="9_AI_image.png"
|
||||
width="1765" height="1287">
|
||||
</figure>
|
||||
<p>Starting with version v0.102.0, AI/LLM integration has been removed from
|
||||
the Trilium Notes core.</p>
|
||||
<p>While a significant amount of effort went into developing this feature,
|
||||
maintaining and supporting it long-term proved to be unsustainable.</p>
|
||||
<p>When upgrading to v0.102.0, your Chat notes will be preserved, but instead
|
||||
of the dedicated chat window they will be turned to a normal <a class="reference-link"
|
||||
href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_6f9hih2hXXZk">Code</a> note,
|
||||
revealing the underlying JSON of the conversation.</p>
|
||||
<h2>Alternative solutions (MCP)</h2>
|
||||
<p>Given the recent advancements of the AI scene, MCP has grown to be more
|
||||
powerful and facilitates easier integrations with various application.</p>
|
||||
<p>As such, there are third-party solutions that integrate an MCP server
|
||||
that can be used with Trilium:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="https://github.com/tan-yong-sheng/triliumnext-mcp">tan-yong-sheng/triliumnext-mcp</a>
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://github.com/perfectra1n/triliumnext-mcp">perfectra1n/triliumnext-mcp</a>
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
<aside class="admonition important">
|
||||
<p>These solutions are third-party and thus not endorsed or supported directly
|
||||
by the Trilium Notes team. Please address questions and issues on their
|
||||
corresponding repository instead.</p>
|
||||
</aside>
|
||||
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI/1_Providers_image.png
generated
vendored
|
Before Width: | Height: | Size: 186 KiB |
22
apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI/Providers.html
generated
vendored
@@ -1,22 +0,0 @@
|
||||
<p>Currently, we support the following providers:</p>
|
||||
<ul>
|
||||
<li><a class="reference-link" href="#root/_help_7EdTxPADv95W">Ollama</a>
|
||||
</li>
|
||||
<li><a class="reference-link" href="#root/_help_ZavFigBX9AwP">OpenAI</a>
|
||||
</li>
|
||||
<li><a class="reference-link" href="#root/_help_e0lkirXEiSNc">Anthropic</a>
|
||||
</li>
|
||||
<li>Voyage AI</li>
|
||||
</ul>
|
||||
<p>To set your preferred chat model, you'll want to enter the provider's
|
||||
name here:</p>
|
||||
<figure class="image image_resized" style="width:88.38%;">
|
||||
<img style="aspect-ratio:1884/1267;" src="Providers_image.png"
|
||||
width="1884" height="1267">
|
||||
</figure>
|
||||
<p>And to set your preferred embedding provider:</p>
|
||||
<figure class="image image_resized"
|
||||
style="width:93.47%;">
|
||||
<img style="aspect-ratio:1907/1002;" src="1_Providers_image.png"
|
||||
width="1907" height="1002">
|
||||
</figure>
|
||||
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 89 KiB |
@@ -1,45 +0,0 @@
|
||||
<p><a href="https://ollama.com/">Ollama</a> can be installed in a variety
|
||||
of ways, and even runs <a href="https://hub.docker.com/r/ollama/ollama">within a Docker container</a>.
|
||||
Ollama will be noticeably quicker when running on a GPU (Nvidia, AMD, Intel),
|
||||
but it can run on CPU and RAM. To install Ollama without any other prerequisites,
|
||||
you can follow their <a href="https://ollama.com/download">installer</a>:</p>
|
||||
<figure
|
||||
class="image image_resized" style="width:50.49%;">
|
||||
<img style="aspect-ratio:785/498;" src="3_Installing Ollama_image.png"
|
||||
width="785" height="498">
|
||||
</figure>
|
||||
<figure class="image image_resized" style="width:40.54%;">
|
||||
<img style="aspect-ratio:467/100;" src="Installing Ollama_image.png"
|
||||
width="467" height="100">
|
||||
</figure>
|
||||
<figure class="image image_resized" style="width:55.73%;">
|
||||
<img style="aspect-ratio:1296/1011;" src="1_Installing Ollama_image.png"
|
||||
width="1296" height="1011">
|
||||
</figure>
|
||||
<p>After their installer completes, if you're on Windows, you should see
|
||||
an entry in the start menu to run it:</p>
|
||||
<figure class="image image_resized"
|
||||
style="width:66.12%;">
|
||||
<img style="aspect-ratio:1161/480;" src="2_Installing Ollama_image.png"
|
||||
width="1161" height="480">
|
||||
</figure>
|
||||
<p>Also, you should have access to the <code spellcheck="false">ollama</code> CLI
|
||||
via Powershell or CMD:</p>
|
||||
<figure class="image image_resized" style="width:86.09%;">
|
||||
<img style="aspect-ratio:1730/924;" src="5_Installing Ollama_image.png"
|
||||
width="1730" height="924">
|
||||
</figure>
|
||||
<p>After Ollama is installed, you can go ahead and <code spellcheck="false">pull</code> the
|
||||
models you want to use and run. Here's a command to pull my favorite tool-compatible
|
||||
model and embedding model as of April 2025:</p><pre><code class="language-text-x-trilium-auto">ollama pull llama3.1:8b
|
||||
ollama pull mxbai-embed-large</code></pre>
|
||||
<p>Also, you can make sure it's running by going to <a href="http://localhost:11434">http://localhost:11434</a> and
|
||||
you should get the following response (port 11434 being the “normal” Ollama
|
||||
port):</p>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:585/202;" src="4_Installing Ollama_image.png"
|
||||
width="585" height="202">
|
||||
</figure>
|
||||
<p>Now that you have Ollama up and running, have a few models pulled, you're
|
||||
ready to go to go ahead and start using Ollama as both a chat provider,
|
||||
and embedding provider!</p>
|
||||
|
Before Width: | Height: | Size: 5.3 KiB |
0
apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI/Providers/OpenAI.html
generated
vendored
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI/Providers_image.png
generated
vendored
|
Before Width: | Height: | Size: 198 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI_image.png
generated
vendored
|
Before Width: | Height: | Size: 175 KiB |
@@ -20,27 +20,25 @@
|
||||
<ul>
|
||||
<li>To indicate that the subtree is hidden, the note will not have an expand
|
||||
button and it will display the number of children to the right.</li>
|
||||
<li
|
||||
>It's not possible to add a new note directly from the tree.
|
||||
<li>It's not possible to add a new note directly from the tree.
|
||||
<ul>
|
||||
<li>For <a class="reference-link" href="#root/_help_GTwFsgaA0lCt">Collections</a>,
|
||||
it's best to use the built-in mechanism to create notes (for example by
|
||||
creating a new point on a geo-map, or by adding a new row in a table).</li>
|
||||
<li
|
||||
>For normal notes, it's still possible to create children via other means
|
||||
<li>For normal notes, it's still possible to create children via other means
|
||||
such as using the <a class="reference-link" href="#root/_help_hrZ1D00cLbal">Internal (reference) links</a> system.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Notes can be dragged from outside the note, case in which they will be
|
||||
cloned into it.
|
||||
<ul>
|
||||
<li>Instead of switching to the child notes that were copied, the parent note
|
||||
is highlighted instead.</li>
|
||||
<li>A notification will indicate this behavior.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Similarly, features such as cut/copy and then paste into the note will
|
||||
also work.</li>
|
||||
</li>
|
||||
<li>Notes can be dragged from outside the note, case in which they will be
|
||||
cloned into it.
|
||||
<ul>
|
||||
<li>Instead of switching to the child notes that were copied, the parent note
|
||||
is highlighted instead.</li>
|
||||
<li>A notification will indicate this behavior.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Similarly, features such as cut/copy and then paste into the note will
|
||||
also work.</li>
|
||||
</ul>
|
||||
<h2>Spotlighting</h2>
|
||||
<figure class="image image-style-align-right">
|
||||
@@ -70,7 +68,7 @@
|
||||
performance reasons or de-cluttering the tree.</p>
|
||||
<p>To toggle this behavior:</p>
|
||||
<ul>
|
||||
<li>Open the collection and in <a class="reference-link" href="#root/pOsGYCXsbNQG/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a>,
|
||||
<li>Open the collection and in <a class="reference-link" href="#root/_help_CssoWBu8I7jF">Collection Properties</a>,
|
||||
look for <em>Hide child notes in tree</em>.</li>
|
||||
<li>Right click the collection note in the <a class="reference-link"
|
||||
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a> and select <em>Advanced</em> → <em>Show subtree</em>.</li>
|
||||
|
||||
164
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections.html
generated
vendored
@@ -1,76 +1,75 @@
|
||||
<p>Collections are a unique type of note that don't have content, but instead
|
||||
display their child notes in various presentation methods.</p>
|
||||
<h2>Main collections</h2>
|
||||
<figure class="table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:1651/810;" src="Collections_collection_ca.webp"
|
||||
width="1651" height="810">
|
||||
</figure>
|
||||
</td>
|
||||
<td><a class="reference-link" href="#root/_help_xWbu3jpNWapp">Calendar</a>
|
||||
<br>which displays a week, month or year calendar with the notes being shown
|
||||
as events. New events can be added easily by dragging across the calendar.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:1643/647;" src="Collections_collection_ta.webp"
|
||||
width="1643" height="647">
|
||||
</figure>
|
||||
</td>
|
||||
<td><a class="reference-link" href="#root/_help_2FvYrpmOXm29">Table</a>
|
||||
<br>displays each note as a row in a table, with <a class="reference-link"
|
||||
href="#root/_help_OFXdgB2nNk1F">Promoted Attributes</a> being shown as well.
|
||||
This makes it easy to visualize attributes of notes, as well as making
|
||||
them easily editable.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:1174/850;" src="Collections_collection_bo.webp"
|
||||
width="1174" height="850">
|
||||
</figure>
|
||||
</td>
|
||||
<td><a class="reference-link" href="#root/_help_CtBQqbwXDx1w">Kanban Board</a>
|
||||
<br>displays notes in columns, grouped by the value of a label. Items and
|
||||
columns can easily be created or dragged around to change their status.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:844/639;" src="Collections_collection_ge.webp"
|
||||
width="844" height="639">
|
||||
</figure>
|
||||
</td>
|
||||
<td><a class="reference-link" href="#root/_help_81SGnPGMk7Xc">Geo Map</a>
|
||||
<br>which displays a geographical map in which the notes are represented as
|
||||
markers/pins on the map. New events can be easily added by pointing on
|
||||
the map.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:1120/763;" src="Collections_collection_pr.webp"
|
||||
width="1120" height="763">
|
||||
</figure>
|
||||
</td>
|
||||
<td><a class="reference-link" href="#root/_help_zP3PMqaG71Ct">Presentation</a>
|
||||
<br>which shows each note as a slide and can be presented full-screen with
|
||||
smooth transitions or exported to PDF for sharing.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:1651/810;" src="Collections_collection_ca.webp"
|
||||
width="1651" height="810">
|
||||
</figure>
|
||||
</td>
|
||||
<td><a class="reference-link" href="#root/_help_xWbu3jpNWapp">Calendar</a>
|
||||
<br>which displays a week, month or year calendar with the notes being shown
|
||||
as events. New events can be added easily by dragging across the calendar.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:1643/647;" src="Collections_collection_ta.webp"
|
||||
width="1643" height="647">
|
||||
</figure>
|
||||
</td>
|
||||
<td><a class="reference-link" href="#root/_help_2FvYrpmOXm29">Table</a>
|
||||
<br>displays each note as a row in a table, with <a class="reference-link"
|
||||
href="#root/_help_OFXdgB2nNk1F">Promoted Attributes</a> being shown as well.
|
||||
This makes it easy to visualize attributes of notes, as well as making
|
||||
them easily editable.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:1174/850;" src="Collections_collection_bo.webp"
|
||||
width="1174" height="850">
|
||||
</figure>
|
||||
</td>
|
||||
<td><a class="reference-link" href="#root/_help_CtBQqbwXDx1w">Kanban Board</a>
|
||||
<br>displays notes in columns, grouped by the value of a label. Items and
|
||||
columns can easily be created or dragged around to change their status.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:844/639;" src="Collections_collection_ge.webp"
|
||||
width="844" height="639">
|
||||
</figure>
|
||||
</td>
|
||||
<td><a class="reference-link" href="#root/_help_81SGnPGMk7Xc">Geo Map</a>
|
||||
<br>which displays a geographical map in which the notes are represented as
|
||||
markers/pins on the map. New events can be easily added by pointing on
|
||||
the map.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<figure class="image">
|
||||
<img style="aspect-ratio:1120/763;" src="Collections_collection_pr.webp"
|
||||
width="1120" height="763">
|
||||
</figure>
|
||||
</td>
|
||||
<td><a class="reference-link" href="#root/_help_zP3PMqaG71Ct">Presentation</a>
|
||||
<br>which shows each note as a slide and can be presented full-screen with
|
||||
smooth transitions or exported to PDF for sharing.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>Classic collections</h2>
|
||||
<p>Classic collections are read-only mode and compiles the contents of all
|
||||
child notes into one continuous view. This makes it ideal for reading extensive
|
||||
@@ -93,23 +92,22 @@
|
||||
even sample notes. To create a collection completely from scratch:</p>
|
||||
<ol>
|
||||
<li>Create a new note of type <em>Text</em> (or any type).</li>
|
||||
<li>Change the <a href="#root/pOsGYCXsbNQG/_help_KSZ04uQ2D1St">note type</a> to <em>Collection</em>.</li>
|
||||
<li
|
||||
>In <a class="reference-link" href="#root/pOsGYCXsbNQG/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a>,
|
||||
<li>Change the <a href="#root/_help_KSZ04uQ2D1St">note type</a> to <em>Collection</em>.</li>
|
||||
<li>In <a class="reference-link" href="#root/_help_CssoWBu8I7jF">Collection Properties</a>,
|
||||
select the desired view type.</li>
|
||||
<li>Consult the help page of the corresponding view type in order to understand
|
||||
how to configure them.</li>
|
||||
<li>Consult the help page of the corresponding view type in order to understand
|
||||
how to configure them.</li>
|
||||
</ol>
|
||||
<h2>Configuration</h2>
|
||||
<p>To change the configuration of a collection or even switch to a different
|
||||
collection (e.g. from Kanban Board to a Calendar), see the <a class="reference-link"
|
||||
href="#root/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a> bar
|
||||
at the top of the note.</p>
|
||||
href="#root/_help_CssoWBu8I7jF">Collection Properties</a> bar at the top
|
||||
of the note.</p>
|
||||
<h2>Archived notes</h2>
|
||||
<p>By default, <a href="#root/_help_MKmLg5x6xkor">archived notes</a> will not be
|
||||
shown in collections. This behavior can be changed by going to
|
||||
<a
|
||||
class="reference-link" href="#root/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a> and checking <em>Show archived notes</em>.</p>
|
||||
class="reference-link" href="#root/_help_CssoWBu8I7jF">Collection Properties</a> and checking <em>Show archived notes</em>.</p>
|
||||
<p>Archived notes will be generally indicated by being greyed out as opposed
|
||||
to the normal ones.</p>
|
||||
<h2>Hiding the child notes from the note tree</h2>
|
||||
@@ -117,21 +115,21 @@
|
||||
the items from the note tree for performance reasons and to reduce clutter.
|
||||
This is especially useful for standalone collections, such as a geomap
|
||||
or a task board.</p>
|
||||
<p>To do so, go to <a class="reference-link" href="#root/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a> and
|
||||
<p>To do so, go to <a class="reference-link" href="#root/_help_CssoWBu8I7jF">Collection Properties</a> and
|
||||
select <em>Hide child notes in tree</em>.</p>
|
||||
<h2>Advanced use cases</h2>
|
||||
<h3>Adding a description to a collection</h3>
|
||||
<p>To add a text before the collection, for example to describe it:</p>
|
||||
<ol>
|
||||
<li>Create a new collection.</li>
|
||||
<li>Change the <a href="#root/pOsGYCXsbNQG/_help_KSZ04uQ2D1St">note type</a> from <em>Collection</em> to <em>Text</em>.</li>
|
||||
<li>Change the <a href="#root/_help_KSZ04uQ2D1St">note type</a> from <em>Collection</em> to <em>Text</em>.</li>
|
||||
</ol>
|
||||
<p>Now the text will be displayed above while still maintaining the collection
|
||||
view.</p>
|
||||
<p>The only downside to this method is that <a class="reference-link"
|
||||
href="#root/pOsGYCXsbNQG/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a> will
|
||||
not be shown anymore. In this case, modify the attributes manually or switch
|
||||
back temporarily to the <em>Collection</em> type for configuration purposes.</p>
|
||||
href="#root/_help_CssoWBu8I7jF">Collection Properties</a> will not be shown
|
||||
anymore. In this case, modify the attributes manually or switch back temporarily
|
||||
to the <em>Collection</em> type for configuration purposes.</p>
|
||||
<h3>Using saved search</h3>
|
||||
<p>Collections, by default, only display the child notes. However, it is
|
||||
possible to use the <a class="reference-link" href="#root/_help_eIg8jdvaoNNd">Search</a> functionality
|
||||
|
||||
632
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html
generated
vendored
@@ -11,10 +11,8 @@
|
||||
time-specific events, not just all-day events.</li>
|
||||
<li>Month view, where the entire month is displayed and all-day events can
|
||||
be inserted. Both time-specific events and all-day events are listed.</li>
|
||||
<li
|
||||
>Year view, which displays the entire year for quick reference.</li>
|
||||
<li
|
||||
>List view, which displays all the events of a given month in sequence.</li>
|
||||
<li>Year view, which displays the entire year for quick reference.</li>
|
||||
<li>List view, which displays all the events of a given month in sequence.</li>
|
||||
</ul>
|
||||
<p>Unlike other Collection view types, the Calendar view also allows some
|
||||
kind of interaction, such as moving events around as well as creating new
|
||||
@@ -56,8 +54,7 @@
|
||||
</ul>
|
||||
</li>
|
||||
<li>Drag and drop an event on the calendar to move it to another day.</li>
|
||||
<li
|
||||
>The length of an event can be changed by placing the mouse to the right
|
||||
<li>The length of an event can be changed by placing the mouse to the right
|
||||
edge of the event and dragging the mouse around.</li>
|
||||
</ul>
|
||||
<h2>Interaction on mobile</h2>
|
||||
@@ -66,26 +63,23 @@
|
||||
<ul>
|
||||
<li>Clicking on an event triggers the contextual menu, including the option
|
||||
to open in <a class="reference-link" href="#root/_help_ZjLYv08Rp3qC">Quick edit</a>.</li>
|
||||
<li
|
||||
>To insert a new event, touch and hold the empty space. When successful,
|
||||
<li>To insert a new event, touch and hold the empty space. When successful,
|
||||
the empty space will become colored to indicate the selection.
|
||||
<ul>
|
||||
<li>Before releasing, drag across multiple spaces to create multi-day events.</li>
|
||||
<li
|
||||
>When released, a prompt will appear to enter the note title.</li>
|
||||
<li>When released, a prompt will appear to enter the note title.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>To move an existing event, touch and hold the event until the empty space
|
||||
near it will become colored.
|
||||
<ul>
|
||||
<li>At this point the event can be dragged across other days on the calendar.</li>
|
||||
<li
|
||||
>Or the event can be resized by tapping on the small circle to the right
|
||||
end of the event.</li>
|
||||
<li>To exit out of editing mode, simply tap the empty space anywhere on the
|
||||
calendar.</li>
|
||||
</li>
|
||||
<li>To move an existing event, touch and hold the event until the empty space
|
||||
near it will become colored.
|
||||
<ul>
|
||||
<li>At this point the event can be dragged across other days on the calendar.</li>
|
||||
<li>Or the event can be resized by tapping on the small circle to the right
|
||||
end of the event.</li>
|
||||
<li>To exit out of editing mode, simply tap the empty space anywhere on the
|
||||
calendar.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Configuring the calendar view</h2>
|
||||
<p>In the <em>Collections</em> tab in the <a class="reference-link" href="#root/_help_BlN9DFI679QC">Ribbon</a>,
|
||||
@@ -96,311 +90,299 @@
|
||||
</ul>
|
||||
<h2>Configuring the calendar using attributes</h2>
|
||||
<p>The following attributes can be added to the Collection type:</p>
|
||||
<figure
|
||||
class="table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:hideWeekends</code>
|
||||
</td>
|
||||
<td>When present (regardless of value), it will hide Saturday and Sundays
|
||||
from the calendar.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:weekNumbers</code>
|
||||
</td>
|
||||
<td>When present (regardless of value), it will show the number of the week
|
||||
on the calendar.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:initialDate</code>
|
||||
</td>
|
||||
<td>Change the date the calendar opens on. When not present, the calendar
|
||||
opens on the current date.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:view</code>
|
||||
</td>
|
||||
<td>
|
||||
<p>Which view to display in the calendar:</p>
|
||||
<ul>
|
||||
<li><code spellcheck="false">timeGridWeek</code> for the <em>week</em> view;</li>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:hideWeekends</code>
|
||||
</td>
|
||||
<td>When present (regardless of value), it will hide Saturday and Sundays
|
||||
from the calendar.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:weekNumbers</code>
|
||||
</td>
|
||||
<td>When present (regardless of value), it will show the number of the week
|
||||
on the calendar.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:initialDate</code>
|
||||
</td>
|
||||
<td>Change the date the calendar opens on. When not present, the calendar
|
||||
opens on the current date.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:view</code>
|
||||
</td>
|
||||
<td>
|
||||
<p>Which view to display in the calendar:</p>
|
||||
<ul>
|
||||
<li><code spellcheck="false">timeGridWeek</code> for the <em>week</em> view;</li>
|
||||
<li
|
||||
><code spellcheck="false">dayGridMonth</code> for the <em>month</em> view;</li>
|
||||
<li
|
||||
><code spellcheck="false">dayGridMonth</code> for the <em>month</em> view;</li>
|
||||
><code spellcheck="false">multiMonthYear</code> for the <em>year</em> view;</li>
|
||||
<li
|
||||
><code spellcheck="false">multiMonthYear</code> for the <em>year</em> view;</li>
|
||||
<li
|
||||
><code spellcheck="false">listMonth</code> for the <em>list</em> view.</li>
|
||||
</ul>
|
||||
<p>Any other value will be dismissed and the default view (month) will be
|
||||
used instead.</p>
|
||||
<p>The value of this label is automatically updated when changing the view
|
||||
using the UI buttons.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">~child:template</code>
|
||||
</td>
|
||||
<td>Defines the template for newly created notes in the calendar (via dragging
|
||||
or clicking).</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>In addition, the first day of the week can be either Sunday or Monday
|
||||
and can be adjusted from the application settings.</p>
|
||||
<h2>Configuring the calendar events using attributes</h2>
|
||||
<p>For each note of the calendar, the following attributes can be used:</p>
|
||||
<figure
|
||||
class="table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#startDate</code>
|
||||
</td>
|
||||
<td>The date the event starts, which will display it in the calendar. The
|
||||
format is <code spellcheck="false">YYYY-MM-DD</code> (year, month and day
|
||||
separated by a minus sign).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#endDate</code>
|
||||
</td>
|
||||
<td>Similar to <code spellcheck="false">startDate</code>, mentions the end
|
||||
date if the event spans across multiple days. The date is inclusive, so
|
||||
the end day is also considered. The attribute can be missing for single-day
|
||||
events.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#startTime</code>
|
||||
</td>
|
||||
<td>The time the event starts at. If this value is missing, then the event
|
||||
is considered a full-day event. The format is <code spellcheck="false">HH:MM</code> (hours
|
||||
in 24-hour format and minutes).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#endTime</code>
|
||||
</td>
|
||||
<td>Similar to <code spellcheck="false">startTime</code>, it mentions the time
|
||||
at which the event ends (in relation with <code spellcheck="false">endDate</code> if
|
||||
present, or <code spellcheck="false">startDate</code>).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#color</code>
|
||||
</td>
|
||||
<td>Displays the event with a specified color (named such as <code spellcheck="false">red</code>,
|
||||
<code
|
||||
spellcheck="false">gray</code>or hex such as <code spellcheck="false">#FF0000</code>). This
|
||||
will also change the color of the note in other places such as the note
|
||||
tree.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:color</code>
|
||||
</td>
|
||||
<td><strong>❌️ Removed since v0.100.0. Use</strong> <code spellcheck="false">**#color**</code> <strong>instead.</strong>
|
||||
<br>
|
||||
<br>Similar to <code spellcheck="false">#color</code>, but applies the color
|
||||
only for the event in the calendar and not for other places such as the
|
||||
note tree.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#iconClass</code>
|
||||
</td>
|
||||
<td>If present, the icon of the note will be displayed to the left of the
|
||||
event title.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:title</code>
|
||||
</td>
|
||||
<td>Changes the title of an event to point to an attribute of the note other
|
||||
than the title, can either a label or a relation (without the <code spellcheck="false">#</code> or
|
||||
<code
|
||||
spellcheck="false">~</code>symbol). See <em>Use-cases</em> for more information.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:displayedAttributes</code>
|
||||
</td>
|
||||
<td>Allows displaying the value of one or more attributes in the calendar
|
||||
like this:
|
||||
<br>
|
||||
<br>
|
||||
<img src="7_Calendar_image.png">
|
||||
<br>
|
||||
<br><code spellcheck="false">#weight="70" #Mood="Good" #calendar:displayedAttributes="weight,Mood"</code>
|
||||
<br>
|
||||
<br>It can also be used with relations, case in which it will display the
|
||||
title of the target note:
|
||||
<br>
|
||||
<br><code spellcheck="false">~assignee=@My assignee #calendar:displayedAttributes="assignee"</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:startDate</code>
|
||||
</td>
|
||||
<td>Allows using a different label to represent the start date, other than
|
||||
<code
|
||||
spellcheck="false">startDate</code>(e.g. <code spellcheck="false">expiryDate</code>). The
|
||||
label name <strong>must not be</strong> prefixed with <code spellcheck="false">#</code>.
|
||||
If the label is not defined for a note, the default will be used instead.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:endDate</code>
|
||||
</td>
|
||||
<td>Similar to <code spellcheck="false">#calendar:startDate</code>, allows
|
||||
changing the attribute which is being used to read the end date.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:startTime</code>
|
||||
</td>
|
||||
<td>Similar to <code spellcheck="false">#calendar:startDate</code>, allows
|
||||
changing the attribute which is being used to read the start time.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:endTime</code>
|
||||
</td>
|
||||
<td>Similar to <code spellcheck="false">#calendar:startDate</code>, allows
|
||||
changing the attribute which is being used to read the end time.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<h2>How the calendar works</h2>
|
||||
<p>
|
||||
<img src="9_Calendar_image.png">
|
||||
</p>
|
||||
<p>The calendar displays all the child notes of the Collection that have
|
||||
a <code spellcheck="false">#startDate</code>. An <code spellcheck="false">#endDate</code> can
|
||||
optionally be added.</p>
|
||||
<p>If editing the start date and end date from the note itself is desirable,
|
||||
the following attributes can be added to the Collection note:</p><pre><code class="language-text-x-trilium-auto">#viewType=calendar #label:startDate(inheritable)="promoted,alias=Start Date,single,date"
|
||||
><code spellcheck="false">listMonth</code> for the <em>list</em> view.</li>
|
||||
</ul>
|
||||
<p>Any other value will be dismissed and the default view (month) will be
|
||||
used instead.</p>
|
||||
<p>The value of this label is automatically updated when changing the view
|
||||
using the UI buttons.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">~child:template</code>
|
||||
</td>
|
||||
<td>Defines the template for newly created notes in the calendar (via dragging
|
||||
or clicking).</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>In addition, the first day of the week can be either Sunday or Monday
|
||||
and can be adjusted from the application settings.</p>
|
||||
<h2>Configuring the calendar events using attributes</h2>
|
||||
<p>For each note of the calendar, the following attributes can be used:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#startDate</code>
|
||||
</td>
|
||||
<td>The date the event starts, which will display it in the calendar. The
|
||||
format is <code spellcheck="false">YYYY-MM-DD</code> (year, month and day
|
||||
separated by a minus sign).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#endDate</code>
|
||||
</td>
|
||||
<td>Similar to <code spellcheck="false">startDate</code>, mentions the end
|
||||
date if the event spans across multiple days. The date is inclusive, so
|
||||
the end day is also considered. The attribute can be missing for single-day
|
||||
events.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#startTime</code>
|
||||
</td>
|
||||
<td>The time the event starts at. If this value is missing, then the event
|
||||
is considered a full-day event. The format is <code spellcheck="false">HH:MM</code> (hours
|
||||
in 24-hour format and minutes).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#endTime</code>
|
||||
</td>
|
||||
<td>Similar to <code spellcheck="false">startTime</code>, it mentions the time
|
||||
at which the event ends (in relation with <code spellcheck="false">endDate</code> if
|
||||
present, or <code spellcheck="false">startDate</code>).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#color</code>
|
||||
</td>
|
||||
<td>Displays the event with a specified color (named such as <code spellcheck="false">red</code>,
|
||||
<code
|
||||
spellcheck="false">gray</code>or hex such as <code spellcheck="false">#FF0000</code>). This
|
||||
will also change the color of the note in other places such as the note
|
||||
tree.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:color</code>
|
||||
</td>
|
||||
<td><strong>❌️ Removed since v0.100.0. Use</strong> <code spellcheck="false">**#color**</code> <strong>instead.</strong>
|
||||
<br>
|
||||
<br>Similar to <code spellcheck="false">#color</code>, but applies the color
|
||||
only for the event in the calendar and not for other places such as the
|
||||
note tree.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#iconClass</code>
|
||||
</td>
|
||||
<td>If present, the icon of the note will be displayed to the left of the
|
||||
event title.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:title</code>
|
||||
</td>
|
||||
<td>Changes the title of an event to point to an attribute of the note other
|
||||
than the title, can either a label or a relation (without the <code spellcheck="false">#</code> or
|
||||
<code
|
||||
spellcheck="false">~</code>symbol). See <em>Use-cases</em> for more information.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:displayedAttributes</code>
|
||||
</td>
|
||||
<td>Allows displaying the value of one or more attributes in the calendar
|
||||
like this:
|
||||
<br>
|
||||
<br>
|
||||
<img src="7_Calendar_image.png">
|
||||
<br>
|
||||
<br><code spellcheck="false">#weight="70" #Mood="Good" #calendar:displayedAttributes="weight,Mood"</code>
|
||||
<br>
|
||||
<br>It can also be used with relations, case in which it will display the
|
||||
title of the target note:
|
||||
<br>
|
||||
<br><code spellcheck="false">~assignee=@My assignee #calendar:displayedAttributes="assignee"</code>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:startDate</code>
|
||||
</td>
|
||||
<td>Allows using a different label to represent the start date, other than
|
||||
<code
|
||||
spellcheck="false">startDate</code>(e.g. <code spellcheck="false">expiryDate</code>). The
|
||||
label name <strong>must not be</strong> prefixed with <code spellcheck="false">#</code>.
|
||||
If the label is not defined for a note, the default will be used instead.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:endDate</code>
|
||||
</td>
|
||||
<td>Similar to <code spellcheck="false">#calendar:startDate</code>, allows
|
||||
changing the attribute which is being used to read the end date.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:startTime</code>
|
||||
</td>
|
||||
<td>Similar to <code spellcheck="false">#calendar:startDate</code>, allows
|
||||
changing the attribute which is being used to read the start time.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code spellcheck="false">#calendar:endTime</code>
|
||||
</td>
|
||||
<td>Similar to <code spellcheck="false">#calendar:startDate</code>, allows
|
||||
changing the attribute which is being used to read the end time.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>How the calendar works</h2>
|
||||
<p>
|
||||
<img src="9_Calendar_image.png">
|
||||
</p>
|
||||
<p>The calendar displays all the child notes of the Collection that have
|
||||
a <code spellcheck="false">#startDate</code>. An <code spellcheck="false">#endDate</code> can
|
||||
optionally be added.</p>
|
||||
<p>If editing the start date and end date from the note itself is desirable,
|
||||
the following attributes can be added to the Collection note:</p><pre><code class="language-text-x-trilium-auto">#viewType=calendar #label:startDate(inheritable)="promoted,alias=Start Date,single,date"
|
||||
#label:endDate(inheritable)="promoted,alias=End Date,single,date"
|
||||
#hidePromotedAttributes </code></pre>
|
||||
<p>This will result in:</p>
|
||||
<p>
|
||||
<img src="8_Calendar_image.png">
|
||||
</p>
|
||||
<p>When not used in a Journal, the calendar is recursive. That is, it will
|
||||
look for events not just in its child notes but also in the children of
|
||||
these child notes.</p>
|
||||
<h2>Use-cases</h2>
|
||||
<h3>Using with the Journal / calendar</h3>
|
||||
<p>It is possible to integrate the calendar view into the Journal with day
|
||||
notes. In order to do so change the note type of the Journal note (calendar
|
||||
root) to Collection and then select the Calendar View.</p>
|
||||
<p>Based on the <code spellcheck="false">#calendarRoot</code> (or <code spellcheck="false">#workspaceCalendarRoot</code>)
|
||||
attribute, the calendar will know that it's in a calendar and apply the
|
||||
following:</p>
|
||||
<ul>
|
||||
<li>The calendar events are now rendered based on their <code spellcheck="false">dateNote</code> attribute
|
||||
rather than <code spellcheck="false">startDate</code>.</li>
|
||||
<li>Interactive editing such as dragging over an empty era or resizing an
|
||||
event is no longer possible.</li>
|
||||
<li>Clicking on the empty space on a date will automatically open that day's
|
||||
note or create it if it does not exist.</li>
|
||||
<li>Direct children of a day note will be displayed on the calendar despite
|
||||
not having a <code spellcheck="false">dateNote</code> attribute. Children
|
||||
of the child notes will not be displayed.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<img src="6_Calendar_image.png" width="1217"
|
||||
height="724">
|
||||
</p>
|
||||
<h3>Using a different attribute as event title</h3>
|
||||
<p>By default, events are displayed on the calendar by their note title.
|
||||
However, it is possible to configure a different attribute to be displayed
|
||||
instead.</p>
|
||||
<p>To do so, assign <code spellcheck="false">#calendar:title</code> to the
|
||||
child note (not the calendar/Collection note), with the value being
|
||||
<code
|
||||
spellcheck="false">name</code>where <code spellcheck="false">name</code> can be any label (make
|
||||
not to add the <code spellcheck="false">#</code> prefix). The attribute can
|
||||
also come through inheritance such as a template attribute. If the note
|
||||
does not have the requested label, the title of the note will be used instead.</p>
|
||||
<figure
|
||||
class="table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><pre><code class="language-text-x-trilium-auto">#startDate=2025-02-11 #endDate=2025-02-13 #name="My vacation" #calendar:title="name"</code></pre>
|
||||
</td>
|
||||
<td>
|
||||
<p> </p>
|
||||
<figure class="image image-style-align-center">
|
||||
<img style="aspect-ratio:445/124;" src="3_Calendar_image.png"
|
||||
width="445" height="124">
|
||||
</figure>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<h3>Using a relation attribute as event title</h3>
|
||||
<p>Similarly to using an attribute, use <code spellcheck="false">#calendar:title</code> and
|
||||
set it to <code spellcheck="false">name</code> where <code spellcheck="false">name</code> is
|
||||
the name of the relation to use.</p>
|
||||
<p>Moreover, if there are more relations of the same name, they will be displayed
|
||||
as multiple events coming from the same note.</p>
|
||||
<figure class="table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><pre><code class="language-text-x-trilium-auto">#startDate=2025-02-14 #endDate=2025-02-15 ~for=@John Smith ~for=@Jane Doe #calendar:title="for"</code></pre>
|
||||
</td>
|
||||
<td>
|
||||
<img src="4_Calendar_image.png" width="294"
|
||||
height="151">
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>Note that it's even possible to have a <code spellcheck="false">#calendar:title</code> on
|
||||
the target note (e.g. “John Smith”) which will try to render an attribute
|
||||
of it. Note that it's not possible to use a relation here as well for safety
|
||||
reasons (an accidental recursion of attributes could cause the application
|
||||
to loop infinitely).</p>
|
||||
<figure class="table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><pre><code class="language-text-x-trilium-auto">#calendar:title="shortName" #shortName="John S."</code></pre>
|
||||
</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center">
|
||||
<img style="aspect-ratio:296/150;" src="1_Calendar_image.png"
|
||||
width="296" height="150">
|
||||
</figure>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<p>This will result in:</p>
|
||||
<p>
|
||||
<img src="8_Calendar_image.png">
|
||||
</p>
|
||||
<p>When not used in a Journal, the calendar is recursive. That is, it will
|
||||
look for events not just in its child notes but also in the children of
|
||||
these child notes.</p>
|
||||
<h2>Use-cases</h2>
|
||||
<h3>Using with the Journal / calendar</h3>
|
||||
<p>It is possible to integrate the calendar view into the Journal with day
|
||||
notes. In order to do so change the note type of the Journal note (calendar
|
||||
root) to Collection and then select the Calendar View.</p>
|
||||
<p>Based on the <code spellcheck="false">#calendarRoot</code> (or <code spellcheck="false">#workspaceCalendarRoot</code>)
|
||||
attribute, the calendar will know that it's in a calendar and apply the
|
||||
following:</p>
|
||||
<ul>
|
||||
<li>The calendar events are now rendered based on their <code spellcheck="false">dateNote</code> attribute
|
||||
rather than <code spellcheck="false">startDate</code>.</li>
|
||||
<li>Interactive editing such as dragging over an empty era or resizing an
|
||||
event is no longer possible.</li>
|
||||
<li>Clicking on the empty space on a date will automatically open that day's
|
||||
note or create it if it does not exist.</li>
|
||||
<li>Direct children of a day note will be displayed on the calendar despite
|
||||
not having a <code spellcheck="false">dateNote</code> attribute. Children
|
||||
of the child notes will not be displayed.</li>
|
||||
</ul>
|
||||
<img src="6_Calendar_image.png" width="1217"
|
||||
height="724">
|
||||
|
||||
<h3>Using a different attribute as event title</h3>
|
||||
<p>By default, events are displayed on the calendar by their note title.
|
||||
However, it is possible to configure a different attribute to be displayed
|
||||
instead.</p>
|
||||
<p>To do so, assign <code spellcheck="false">#calendar:title</code> to the
|
||||
child note (not the calendar/Collection note), with the value being
|
||||
<code
|
||||
spellcheck="false">name</code>where <code spellcheck="false">name</code> can be any label (make
|
||||
not to add the <code spellcheck="false">#</code> prefix). The attribute can
|
||||
also come through inheritance such as a template attribute. If the note
|
||||
does not have the requested label, the title of the note will be used instead.</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><pre><code class="language-text-x-trilium-auto">#startDate=2025-02-11 #endDate=2025-02-13 #name="My vacation" #calendar:title="name"</code></pre>
|
||||
</td>
|
||||
<td>
|
||||
<p> </p>
|
||||
<figure class="image image-style-align-center">
|
||||
<img style="aspect-ratio:445/124;" src="3_Calendar_image.png"
|
||||
width="445" height="124">
|
||||
</figure>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3>Using a relation attribute as event title</h3>
|
||||
<p>Similarly to using an attribute, use <code spellcheck="false">#calendar:title</code> and
|
||||
set it to <code spellcheck="false">name</code> where <code spellcheck="false">name</code> is
|
||||
the name of the relation to use.</p>
|
||||
<p>Moreover, if there are more relations of the same name, they will be displayed
|
||||
as multiple events coming from the same note.</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><pre><code class="language-text-x-trilium-auto">#startDate=2025-02-14 #endDate=2025-02-15 ~for=@John Smith ~for=@Jane Doe #calendar:title="for"</code></pre>
|
||||
</td>
|
||||
<td>
|
||||
<img src="4_Calendar_image.png" width="294"
|
||||
height="151">
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Note that it's even possible to have a <code spellcheck="false">#calendar:title</code> on
|
||||
the target note (e.g. “John Smith”) which will try to render an attribute
|
||||
of it. Note that it's not possible to use a relation here as well for safety
|
||||
reasons (an accidental recursion of attributes could cause the application
|
||||
to loop infinitely).</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><pre><code class="language-text-x-trilium-auto">#calendar:title="shortName" #shortName="John S."</code></pre>
|
||||
</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center">
|
||||
<img style="aspect-ratio:296/150;" src="1_Calendar_image.png"
|
||||
width="296" height="150">
|
||||
</figure>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -3,25 +3,23 @@
|
||||
width="1177" height="98">
|
||||
</figure>
|
||||
<p>The <em>Collection Properties</em> is a toolbar that is displayed at the
|
||||
top of every <a href="#root/pOsGYCXsbNQG/_help_GTwFsgaA0lCt">collection note</a>.</p>
|
||||
top of every <a href="#root/_help_GTwFsgaA0lCt">collection note</a>.</p>
|
||||
<p>For versions prior to v0.102.0, this feature was only available for the
|
||||
<a
|
||||
class="reference-link" href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/Vc8PjrjAGuOp/_help_IjZS7iK5EXtb">New Layout</a>. Starting with this version, the collection properties
|
||||
class="reference-link" href="#root/_help_IjZS7iK5EXtb">New Layout</a>. Starting with this version, the collection properties
|
||||
are enabled for the Old layout as well, and <a class="reference-link"
|
||||
href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/Vc8PjrjAGuOp/_help_BlN9DFI679QC">Ribbon</a> no
|
||||
longer contains a dedicated tab for collection properties.</p>
|
||||
href="#root/_help_BlN9DFI679QC">Ribbon</a> no longer contains a dedicated
|
||||
tab for collection properties.</p>
|
||||
<p>The collection properties has:</p>
|
||||
<ul>
|
||||
<li>A quick selector for the view type (e.g. grid, calendar, board).</li>
|
||||
<li
|
||||
>A settings button with:
|
||||
<li>A settings button with:
|
||||
<ul>
|
||||
<li>Settings for the current view, for example hiding the weekends in a calendar.</li>
|
||||
<li
|
||||
>Generic settings for the collection, such as <a href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/Vc8PjrjAGuOp/oPVyFC7WL2Lp/_help_wyaGBBQrl4i3">hiding the child notes</a> or
|
||||
showing <a href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/BFs8mudNFgCS/_help_MKmLg5x6xkor">archived notes</a>.</li>
|
||||
<li>Generic settings for the collection, such as <a href="#root/_help_wyaGBBQrl4i3">hiding the child notes</a> or
|
||||
showing <a href="#root/_help_MKmLg5x6xkor">archived notes</a>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Specific interactions for the current view, for example month selector
|
||||
and view switcher for the calendar.</li>
|
||||
</li>
|
||||
<li>Specific interactions for the current view, for example month selector
|
||||
and view switcher for the calendar.</li>
|
||||
</ul>
|
||||
576
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Geo Map.html
generated
vendored
@@ -25,60 +25,59 @@
|
||||
restored when visiting again the note.</p>
|
||||
<h2>Adding a marker using the map</h2>
|
||||
<h3>Adding a new note using the plus button</h3>
|
||||
<figure class="table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>To create a marker, first navigate to the desired point on the map. Then
|
||||
press the
|
||||
<img src="9_Geo Map_image.png">button in the <a href="#root/_help_XpOYSgsLkTJy">Floating buttons</a> (top-right)
|
||||
area.
|
||||
<br>
|
||||
<br>If the button is not visible, make sure the button section is visible
|
||||
by pressing the chevron button (
|
||||
<img src="15_Geo Map_image.png">) in the top-right of the map.</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:1730/416;width:100%;" src="2_Geo Map_image.png"
|
||||
width="1730" height="416">
|
||||
</td>
|
||||
<td>Once pressed, the map will enter in the insert mode, as illustrated by
|
||||
the notification.
|
||||
<br>
|
||||
<br>Simply click the point on the map where to place the marker, or the Escape
|
||||
key to cancel.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:1586/404;width:100%;" src="7_Geo Map_image.png"
|
||||
width="1586" height="404">
|
||||
</td>
|
||||
<td>Enter the name of the marker/note to be created.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>4</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:1696/608;width:100%;" src="14_Geo Map_image.png"
|
||||
width="1696" height="608">
|
||||
</td>
|
||||
<td>Once confirmed, the marker will show up on the map and it will also be
|
||||
displayed as a child note of the map.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>To create a marker, first navigate to the desired point on the map. Then
|
||||
press the
|
||||
<img src="9_Geo Map_image.png">button in the <a href="#root/_help_XpOYSgsLkTJy">Floating buttons</a> (top-right)
|
||||
area.
|
||||
<br>
|
||||
<br>If the button is not visible, make sure the button section is visible
|
||||
by pressing the chevron button (
|
||||
<img src="15_Geo Map_image.png">) in the top-right of the map.</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:1730/416;width:100%;" src="2_Geo Map_image.png"
|
||||
width="1730" height="416">
|
||||
</td>
|
||||
<td>Once pressed, the map will enter in the insert mode, as illustrated by
|
||||
the notification.
|
||||
<br>
|
||||
<br>Simply click the point on the map where to place the marker, or the Escape
|
||||
key to cancel.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:1586/404;width:100%;" src="7_Geo Map_image.png"
|
||||
width="1586" height="404">
|
||||
</td>
|
||||
<td>Enter the name of the marker/note to be created.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>4</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:1696/608;width:100%;" src="14_Geo Map_image.png"
|
||||
width="1696" height="608">
|
||||
</td>
|
||||
<td>Once confirmed, the marker will show up on the map and it will also be
|
||||
displayed as a child note of the map.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3>Adding a new note using the contextual menu</h3>
|
||||
<ol>
|
||||
<li>Right click anywhere on the map, where to place the newly created marker
|
||||
@@ -91,18 +90,15 @@
|
||||
<h3>Adding an existing note on note from the note tree</h3>
|
||||
<ol>
|
||||
<li>Select the desired note in the <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li>
|
||||
<li
|
||||
>Hold the mouse on the note and drag it to the map to the desired location.</li>
|
||||
<li
|
||||
>The map should be updated with the new marker.</li>
|
||||
<li>Hold the mouse on the note and drag it to the map to the desired location.</li>
|
||||
<li>The map should be updated with the new marker.</li>
|
||||
</ol>
|
||||
<p>This works for:</p>
|
||||
<ul>
|
||||
<li>Notes that are not part of the geo map, case in which a <a href="#root/_help_IakOLONlIfGI">clone</a> will
|
||||
be created.</li>
|
||||
<li>Notes that are a child of the geo map but not yet positioned on the map.</li>
|
||||
<li
|
||||
>Notes that are a child of the geo map and also positioned, case in which
|
||||
<li>Notes that are a child of the geo map and also positioned, case in which
|
||||
the marker will be relocated to the new position.</li>
|
||||
</ul>
|
||||
<aside class="admonition note">
|
||||
@@ -112,10 +108,8 @@
|
||||
<h2>How the location of the markers is stored</h2>
|
||||
<p>The location of a marker is stored in the <code spellcheck="false">#geolocation</code> attribute
|
||||
of the child notes:</p>
|
||||
<p>
|
||||
<img src="16_Geo Map_image.png" width="1288"
|
||||
height="278">
|
||||
</p>
|
||||
<img src="16_Geo Map_image.png"
|
||||
width="1288" height="278">
|
||||
<p>This value can be added manually if needed. The value of the attribute
|
||||
is made up of the latitude and longitude separated by a comma.</p>
|
||||
<h2>Repositioning markers</h2>
|
||||
@@ -136,8 +130,7 @@
|
||||
</li>
|
||||
<li>Middle-clicking the marker will open the note in a new tab.</li>
|
||||
<li>Right-clicking the marker will open a contextual menu (as described below).</li>
|
||||
<li
|
||||
>If the map is in read-only mode, clicking on a marker will open a
|
||||
<li>If the map is in read-only mode, clicking on a marker will open a
|
||||
<a
|
||||
class="reference-link" href="#root/_help_ZjLYv08Rp3qC">Quick edit</a> popup for the corresponding note.</li>
|
||||
</ul>
|
||||
@@ -183,237 +176,230 @@
|
||||
<p>The value of the attribute is made up of the latitude and longitude separated
|
||||
by a comma.</p>
|
||||
<h3>Adding from Google Maps</h3>
|
||||
<figure class="table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center image_resized" style="width:56.84%;">
|
||||
<img style="aspect-ratio:732/918;" src="11_Geo Map_image.png"
|
||||
width="732" height="918">
|
||||
</figure>
|
||||
</td>
|
||||
<td>Go to Google Maps on the web and look for a desired location, right click
|
||||
on it and a context menu will show up.
|
||||
<br>
|
||||
<br>Simply click on the first item displaying the coordinates and they will
|
||||
be copied to clipboard.
|
||||
<br>
|
||||
<br>Then paste the value inside the text box into the <code spellcheck="false">#geolocation</code> attribute
|
||||
of a child note of the map (don't forget to surround the value with a
|
||||
<code
|
||||
spellcheck="false">"</code>character).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center image_resized" style="width:100%;">
|
||||
<img style="aspect-ratio:518/84;" src="4_Geo Map_image.png"
|
||||
width="518" height="84">
|
||||
</figure>
|
||||
</td>
|
||||
<td>In Trilium, create a child note under the map.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center image_resized" style="width:100%;">
|
||||
<img style="aspect-ratio:1074/276;" src="10_Geo Map_image.png"
|
||||
width="1074" height="276">
|
||||
</figure>
|
||||
</td>
|
||||
<td>And then go to Owned Attributes and type <code spellcheck="false">#geolocation="</code>,
|
||||
then paste from the clipboard as-is and then add the ending <code spellcheck="false">"</code> character.
|
||||
Press Enter to confirm and the map should now be updated to contain the
|
||||
new note.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center image_resized" style="width:56.84%;">
|
||||
<img style="aspect-ratio:732/918;" src="11_Geo Map_image.png"
|
||||
width="732" height="918">
|
||||
</figure>
|
||||
</td>
|
||||
<td>Go to Google Maps on the web and look for a desired location, right click
|
||||
on it and a context menu will show up.
|
||||
<br>
|
||||
<br>Simply click on the first item displaying the coordinates and they will
|
||||
be copied to clipboard.
|
||||
<br>
|
||||
<br>Then paste the value inside the text box into the <code spellcheck="false">#geolocation</code> attribute
|
||||
of a child note of the map (don't forget to surround the value with a
|
||||
<code
|
||||
spellcheck="false">"</code>character).</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center image_resized" style="width:100%;">
|
||||
<img style="aspect-ratio:518/84;" src="4_Geo Map_image.png"
|
||||
width="518" height="84">
|
||||
</figure>
|
||||
</td>
|
||||
<td>In Trilium, create a child note under the map.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center image_resized" style="width:100%;">
|
||||
<img style="aspect-ratio:1074/276;" src="10_Geo Map_image.png"
|
||||
width="1074" height="276">
|
||||
</figure>
|
||||
</td>
|
||||
<td>And then go to Owned Attributes and type <code spellcheck="false">#geolocation="</code>,
|
||||
then paste from the clipboard as-is and then add the ending <code spellcheck="false">"</code> character.
|
||||
Press Enter to confirm and the map should now be updated to contain the
|
||||
new note.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3>Adding from OpenStreetMap</h3>
|
||||
<p>Similarly to the Google Maps approach:</p>
|
||||
<figure class="table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:562/454;width:100%;" src="1_Geo Map_image.png"
|
||||
width="562" height="454">
|
||||
</td>
|
||||
<td>Go to any location on openstreetmap.org and right click to bring up the
|
||||
context menu. Select the “Show address” item.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:696/480;width:100%;" src="Geo Map_image.png"
|
||||
width="696" height="480">
|
||||
</td>
|
||||
<td>The address will be visible in the top-left of the screen, in the place
|
||||
of the search bar.
|
||||
<br>
|
||||
<br>Select the coordinates and copy them into the clipboard.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:640/276;width:100%;" src="5_Geo Map_image.png"
|
||||
width="640" height="276">
|
||||
</td>
|
||||
<td>Simply paste the value inside the text box into the <code spellcheck="false">#geolocation</code> attribute
|
||||
of a child note of the map and then it should be displayed on the map.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:562/454;width:100%;" src="1_Geo Map_image.png"
|
||||
width="562" height="454">
|
||||
</td>
|
||||
<td>Go to any location on openstreetmap.org and right click to bring up the
|
||||
context menu. Select the “Show address” item.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:696/480;width:100%;" src="Geo Map_image.png"
|
||||
width="696" height="480">
|
||||
</td>
|
||||
<td>The address will be visible in the top-left of the screen, in the place
|
||||
of the search bar.
|
||||
<br>
|
||||
<br>Select the coordinates and copy them into the clipboard.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:640/276;width:100%;" src="5_Geo Map_image.png"
|
||||
width="640" height="276">
|
||||
</td>
|
||||
<td>Simply paste the value inside the text box into the <code spellcheck="false">#geolocation</code> attribute
|
||||
of a child note of the map and then it should be displayed on the map.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>Adding GPS tracks (.gpx)</h2>
|
||||
<p>Trilium has basic support for displaying GPS tracks on the geo map.</p>
|
||||
<figure
|
||||
class="table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center">
|
||||
<img style="aspect-ratio:226/74;" src="3_Geo Map_image.png"
|
||||
width="226" height="74">
|
||||
</figure>
|
||||
</td>
|
||||
<td>To add a track, simply drag & drop a .gpx file inside the geo map
|
||||
in the note tree.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center">
|
||||
<img style="aspect-ratio:322/222;" src="13_Geo Map_image.png"
|
||||
width="322" height="222">
|
||||
</figure>
|
||||
</td>
|
||||
<td>In order for the file to be recognized as a GPS track, it needs to show
|
||||
up as <code spellcheck="false">application/gpx+xml</code> in the <em>File type</em> field.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center">
|
||||
<img style="aspect-ratio:620/530;" src="6_Geo Map_image.png"
|
||||
width="620" height="530">
|
||||
</figure>
|
||||
</td>
|
||||
<td>When going back to the map, the track should now be visible.
|
||||
<br>
|
||||
<br>The start and end points of the track are indicated by the two blue markers.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</figure>
|
||||
<aside class="admonition note">
|
||||
<p>The starting point of the track will be displayed as a marker, with the
|
||||
name of the note underneath. The start marker will also respect the icon
|
||||
and the <code spellcheck="false">color</code> of the note. The end marker
|
||||
is displayed with a distinct icon.</p>
|
||||
<p>If the GPX contains waypoints, they will also be displayed. If they have
|
||||
a name, it is displayed when hovering over it with the mouse.</p>
|
||||
</aside>
|
||||
<h2>Read-only mode</h2>
|
||||
<p>When a map is in read-only all editing features will be disabled such
|
||||
as:</p>
|
||||
<ul>
|
||||
<li>The add button in the <a class="reference-link" href="#root/_help_XpOYSgsLkTJy">Floating buttons</a>.</li>
|
||||
<li
|
||||
>Dragging markers.</li>
|
||||
<li>Editing from the contextual menu (removing locations or adding new items).</li>
|
||||
</ul>
|
||||
<p>To enable read-only mode simply press the <em>Lock</em> icon from the
|
||||
<a
|
||||
class="reference-link" href="#root/_help_XpOYSgsLkTJy">Floating buttons</a>. To disable it, press the button again.</p>
|
||||
<h2>Configuration</h2>
|
||||
<h3>Map Style</h3>
|
||||
<p>The styling of the map can be adjusted in the <a class="reference-link"
|
||||
href="#root/pOsGYCXsbNQG/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a> or
|
||||
manually via the <code spellcheck="false">#map:style</code> attribute.</p>
|
||||
<p>The geo map comes with two different types of styles:</p>
|
||||
<ul>
|
||||
<li>Raster styles
|
||||
<ul>
|
||||
<li>For these styles the map is represented as a grid of images at different
|
||||
zoom levels. This is the traditional way OpenStreetMap used to work.</li>
|
||||
<li
|
||||
>Zoom is slightly restricted.</li>
|
||||
<li>Currently, the only raster theme is the original OpenStreetMap style.</li>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center">
|
||||
<img style="aspect-ratio:226/74;" src="3_Geo Map_image.png"
|
||||
width="226" height="74">
|
||||
</figure>
|
||||
</td>
|
||||
<td>To add a track, simply drag & drop a .gpx file inside the geo map
|
||||
in the note tree.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center">
|
||||
<img style="aspect-ratio:322/222;" src="13_Geo Map_image.png"
|
||||
width="322" height="222">
|
||||
</figure>
|
||||
</td>
|
||||
<td>In order for the file to be recognized as a GPS track, it needs to show
|
||||
up as <code spellcheck="false">application/gpx+xml</code> in the <em>File type</em> field.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>
|
||||
<figure class="image image-style-align-center">
|
||||
<img style="aspect-ratio:620/530;" src="6_Geo Map_image.png"
|
||||
width="620" height="530">
|
||||
</figure>
|
||||
</td>
|
||||
<td>When going back to the map, the track should now be visible.
|
||||
<br>
|
||||
<br>The start and end points of the track are indicated by the two blue markers.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<aside class="admonition note">
|
||||
<p>The starting point of the track will be displayed as a marker, with the
|
||||
name of the note underneath. The start marker will also respect the icon
|
||||
and the <code spellcheck="false">color</code> of the note. The end marker
|
||||
is displayed with a distinct icon.</p>
|
||||
<p>If the GPX contains waypoints, they will also be displayed. If they have
|
||||
a name, it is displayed when hovering over it with the mouse.</p>
|
||||
</aside>
|
||||
<h2>Read-only mode</h2>
|
||||
<p>When a map is in read-only all editing features will be disabled such
|
||||
as:</p>
|
||||
<ul>
|
||||
<li>The add button in the <a class="reference-link" href="#root/_help_XpOYSgsLkTJy">Floating buttons</a>.</li>
|
||||
<li>Dragging markers.</li>
|
||||
<li>Editing from the contextual menu (removing locations or adding new items).</li>
|
||||
</ul>
|
||||
<p>To enable read-only mode simply press the <em>Lock</em> icon from the
|
||||
<a
|
||||
class="reference-link" href="#root/_help_XpOYSgsLkTJy">Floating buttons</a>. To disable it, press the button again.</p>
|
||||
<h2>Configuration</h2>
|
||||
<h3>Map Style</h3>
|
||||
<p>The styling of the map can be adjusted in the <a class="reference-link"
|
||||
href="#root/_help_CssoWBu8I7jF">Collection Properties</a> or manually via
|
||||
the <code spellcheck="false">#map:style</code> attribute.</p>
|
||||
<p>The geo map comes with two different types of styles:</p>
|
||||
<ul>
|
||||
<li>Raster styles
|
||||
<ul>
|
||||
<li>For these styles the map is represented as a grid of images at different
|
||||
zoom levels. This is the traditional way OpenStreetMap used to work.</li>
|
||||
<li>Zoom is slightly restricted.</li>
|
||||
<li>Currently, the only raster theme is the original OpenStreetMap style.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Vector styles
|
||||
<ul>
|
||||
<li>Vector styles are not represented as images, but as geometrical shapes.
|
||||
This makes the rendering much smoother, especially when zooming and looking
|
||||
at the building edges, for example.</li>
|
||||
<li>The map can be zoomed in much further.</li>
|
||||
<li>These come both in a light and a dark version.</li>
|
||||
<li>The vector styles come from <a href="https://versatiles.org/">VersaTiles</a>,
|
||||
a free and open-source project providing map tiles based on OpenStreetMap.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Custom map style / tiles</h3>
|
||||
<p>Starting with v0.102.0 it is possible to use custom tile sets, but only
|
||||
in raster format.</p>
|
||||
<p>To do so, manually set the <code spellcheck="false">#map:style</code>
|
||||
<a
|
||||
href="#root/_help_HI6GBBIduIgv">label</a>to the URL of the tile set. For example, to use Esri.NatGeoWorldMap,
|
||||
set the value to <a href="https://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/%7Bz%7D/%7By%7D/%7Bx%7D."><code spellcheck="false">https://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}</code>.</a>
|
||||
</p>
|
||||
<aside class="admonition note">
|
||||
<p>For a list of tile sets, see the <a href="https://leaflet-extras.github.io/leaflet-providers/preview/">Leaflet Providers preview</a> page.
|
||||
Select a desired tile set and just copy the URL from the <em>Plain JavaScript</em> example.</p>
|
||||
</aside>
|
||||
<p>Custom vector map support is planned, but not yet implemented.</p>
|
||||
<h3>Other options</h3>
|
||||
<p>The following options can be configured either via the <a class="reference-link"
|
||||
href="#root/pOsGYCXsbNQG/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a>,
|
||||
by clicking on the settings (Gear icon). Alternatively, each of these options
|
||||
also have a corresponding <a href="#root/_help_HI6GBBIduIgv">label</a> that can
|
||||
be set manually.</p>
|
||||
<ul>
|
||||
<li>Scale, which illustrates the scale of the map in kilometers and miles
|
||||
in the bottom-left of the map.</li>
|
||||
<li>The name of the markers is displayed by default underneath the pin on
|
||||
the map. Since v0.102.0, it is possible to hide these labels which increases
|
||||
the performance and decreases clutter when there are many markers on the
|
||||
map.</li>
|
||||
</ul>
|
||||
<h2>Troubleshooting</h2>
|
||||
<figure class="image image-style-align-right image_resized" style="width:34.06%;">
|
||||
<img style="aspect-ratio:678/499;" src="12_Geo Map_image.png"
|
||||
width="678" height="499">
|
||||
</figure>
|
||||
<h3>Grid-like artifacts on the map</h3>
|
||||
<p>This occurs if the application is not at 100% zoom which causes the pixels
|
||||
of the map to not render correctly due to fractional scaling. The only
|
||||
possible solution is to set the UI zoom at 100% (default keyboard shortcut
|
||||
is <kbd>Ctrl</kbd>+<kbd>0</kbd>).</p>
|
||||
</li>
|
||||
<li>Vector styles
|
||||
<ul>
|
||||
<li>Vector styles are not represented as images, but as geometrical shapes.
|
||||
This makes the rendering much smoother, especially when zooming and looking
|
||||
at the building edges, for example.</li>
|
||||
<li>The map can be zoomed in much further.</li>
|
||||
<li>These come both in a light and a dark version.</li>
|
||||
<li>The vector styles come from <a href="https://versatiles.org/">VersaTiles</a>,
|
||||
a free and open-source project providing map tiles based on OpenStreetMap.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Custom map style / tiles</h3>
|
||||
<p>Starting with v0.102.0 it is possible to use custom tile sets, but only
|
||||
in raster format.</p>
|
||||
<p>To do so, manually set the <code spellcheck="false">#map:style</code>
|
||||
<a
|
||||
href="#root/_help_HI6GBBIduIgv">label</a>to the URL of the tile set. For example, to use Esri.NatGeoWorldMap,
|
||||
set the value to <a href="https://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/%7Bz%7D/%7By%7D/%7Bx%7D."><code spellcheck="false">https://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}</code>.</a>
|
||||
</p>
|
||||
<aside class="admonition note">
|
||||
<p>For a list of tile sets, see the <a href="https://leaflet-extras.github.io/leaflet-providers/preview/">Leaflet Providers preview</a> page.
|
||||
Select a desired tile set and just copy the URL from the <em>Plain JavaScript</em> example.</p>
|
||||
</aside>
|
||||
<p>Custom vector map support is planned, but not yet implemented.</p>
|
||||
<h3>Other options</h3>
|
||||
<p>The following options can be configured either via the <a class="reference-link"
|
||||
href="#root/_help_CssoWBu8I7jF">Collection Properties</a>, by clicking on the
|
||||
settings (Gear icon). Alternatively, each of these options also have a
|
||||
corresponding <a href="#root/_help_HI6GBBIduIgv">label</a> that can be set manually.</p>
|
||||
<ul>
|
||||
<li>Scale, which illustrates the scale of the map in kilometers and miles
|
||||
in the bottom-left of the map.</li>
|
||||
<li>The name of the markers is displayed by default underneath the pin on
|
||||
the map. Since v0.102.0, it is possible to hide these labels which increases
|
||||
the performance and decreases clutter when there are many markers on the
|
||||
map.</li>
|
||||
</ul>
|
||||
<h2>Troubleshooting</h2>
|
||||
<figure class="image image-style-align-right image_resized" style="width:34.06%;">
|
||||
<img style="aspect-ratio:678/499;" src="12_Geo Map_image.png"
|
||||
width="678" height="499">
|
||||
</figure>
|
||||
|
||||
<h3>Grid-like artifacts on the map</h3>
|
||||
<p>This occurs if the application is not at 100% zoom which causes the pixels
|
||||
of the map to not render correctly due to fractional scaling. The only
|
||||
possible solution is to set the UI zoom at 100% (default keyboard shortcut
|
||||
is <kbd>Ctrl</kbd>+<kbd>0</kbd>).</p>
|
||||
80
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Kanban Board.html
generated
vendored
@@ -28,15 +28,14 @@
|
||||
<li>To reorder a column, simply hold the mouse over the title and drag it
|
||||
to the desired position.</li>
|
||||
<li>To delete a column, right click on its title and select <em>Delete column</em>.</li>
|
||||
<li
|
||||
>To rename a column, click on the note title.
|
||||
<li>To rename a column, click on the note title.
|
||||
<ul>
|
||||
<li>Press Enter to confirm.</li>
|
||||
<li>Upon renaming a column, the corresponding status attribute of all its
|
||||
notes will be changed in bulk.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>If there are many columns, use the mouse wheel to scroll.</li>
|
||||
</li>
|
||||
<li>If there are many columns, use the mouse wheel to scroll.</li>
|
||||
</ul>
|
||||
<h3>Working with notes</h3>
|
||||
<ul>
|
||||
@@ -80,16 +79,14 @@
|
||||
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</p>
|
||||
<ol>
|
||||
<li>Select the desired note in the <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li>
|
||||
<li
|
||||
>Hold the mouse on the note and drag it to the to the desired column.</li>
|
||||
<li>Hold the mouse on the note and drag it to the to the desired column.</li>
|
||||
</ol>
|
||||
<p>This works for:</p>
|
||||
<ul>
|
||||
<li>Notes that are not children of the board, case in which a <a href="#root/_help_IakOLONlIfGI">clone</a> will
|
||||
be created.</li>
|
||||
<li>Notes that are children of the board, but not yet assigned on the board.</li>
|
||||
<li
|
||||
>Notes that are children of the board, case in which they will be moved
|
||||
<li>Notes that are children of the board, case in which they will be moved
|
||||
to the new column.</li>
|
||||
</ul>
|
||||
<h3>Keyboard interaction</h3>
|
||||
@@ -99,10 +96,9 @@
|
||||
column titles, notes and the “New item” button for each of the columns,
|
||||
in sequential order.</li>
|
||||
<li>To rename a column or a note, press <kbd>F2</kbd> while it is focused.</li>
|
||||
<li
|
||||
>To open a specific note or create a new item, press <kbd>Enter</kbd> while
|
||||
<li>To open a specific note or create a new item, press <kbd>Enter</kbd> while
|
||||
it is focused.</li>
|
||||
<li>To dismiss a rename of a note or a column, press <kbd>Escape</kbd>.</li>
|
||||
<li>To dismiss a rename of a note or a column, press <kbd>Escape</kbd>.</li>
|
||||
</ul>
|
||||
<h2>Configuration</h2>
|
||||
<h3>Displaying custom attributes</h3>
|
||||
@@ -118,9 +114,8 @@
|
||||
<ol>
|
||||
<li>Go to board note.</li>
|
||||
<li>In the ribbon select <em>Owned Attributes</em> → plus button → <em>Add new label/relation definition</em>.</li>
|
||||
<li
|
||||
>Configure the attribute as desired.</li>
|
||||
<li>Check <em>Inheritable</em> to make it applicable to child notes automatically.</li>
|
||||
<li>Configure the attribute as desired.</li>
|
||||
<li>Check <em>Inheritable</em> to make it applicable to child notes automatically.</li>
|
||||
</ol>
|
||||
<p>After creating the attribute, click on a note and fill in the promoted
|
||||
attributes which should then reflect inside the board.</p>
|
||||
@@ -131,15 +126,13 @@
|
||||
assigning a custom name.</li>
|
||||
<li>Both “Single value” and “Multi value” attributes are supported. In case
|
||||
of multi-value, a badge is displayed for every instance of the attribute.</li>
|
||||
<li
|
||||
>All label types are supported, including dates, booleans and URLs.</li>
|
||||
<li
|
||||
>Relation attributes are also supported as well, showing a link with the
|
||||
target note title and icon.</li>
|
||||
<li>Currently, it's not possible to adjust which promoted attributes are displayed,
|
||||
since all promoted attributes will be displayed (except the <code spellcheck="false">board:groupBy</code> one).
|
||||
There are plans to improve upon this being able to hide promoted attributes
|
||||
individually.</li>
|
||||
<li>All label types are supported, including dates, booleans and URLs.</li>
|
||||
<li>Relation attributes are also supported as well, showing a link with the
|
||||
target note title and icon.</li>
|
||||
<li>Currently, it's not possible to adjust which promoted attributes are displayed,
|
||||
since all promoted attributes will be displayed (except the <code spellcheck="false">board:groupBy</code> one).
|
||||
There are plans to improve upon this being able to hide promoted attributes
|
||||
individually.</li>
|
||||
</ul>
|
||||
<h3>Grouping by another label</h3>
|
||||
<p>By default, the label used to group the notes is <code spellcheck="false">#status</code>.
|
||||
@@ -157,33 +150,36 @@
|
||||
<ul>
|
||||
<li>The columns represent the <em>target notes</em> of a relation.</li>
|
||||
<li>When creating a new column, a note is selected instead of a column name.</li>
|
||||
<li
|
||||
>The column icon will match the target note.</li>
|
||||
<li>Moving notes between columns will change its relation.</li>
|
||||
<li>Renaming an existing column will change the target note of all the notes
|
||||
in that column.</li>
|
||||
<li>The column icon will match the target note.</li>
|
||||
<li>Moving notes between columns will change its relation.</li>
|
||||
<li>Renaming an existing column will change the target note of all the notes
|
||||
in that column.</li>
|
||||
</ul>
|
||||
<p>Using relations instead of labels has some benefits:</p>
|
||||
<ul>
|
||||
<li>The status/grouping of the notes is visible outside the Kanban board,
|
||||
for example on the <a class="reference-link" href="#root/_help_bdUJEHsAPYQR">Note Map</a>.</li>
|
||||
<li
|
||||
>Columns can have icons.</li>
|
||||
<li>Renaming columns is less intensive since it simply involves changing the
|
||||
note title of the target note instead of having to do a bulk rename.</li>
|
||||
<li>Columns can have icons.</li>
|
||||
<li>Renaming columns is less intensive since it simply involves changing the
|
||||
note title of the target note instead of having to do a bulk rename.</li>
|
||||
</ul>
|
||||
<p>To do so:</p>
|
||||
<ol>
|
||||
<li>First, create a Kanban board from scratch and not a template:</li>
|
||||
<li
|
||||
>Assign <code spellcheck="false">#viewType=board #hidePromotedAttributes</code> to
|
||||
emulate the default template.</li>
|
||||
<li>Set <code spellcheck="false">#board:groupBy</code> to the name of a relation
|
||||
<li>
|
||||
<p>First, create a Kanban board from scratch and not a template:</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Assign <code spellcheck="false">#viewType=board #hidePromotedAttributes</code> to
|
||||
emulate the default template.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Set <code spellcheck="false">#board:groupBy</code> to the name of a relation
|
||||
to group by, <strong>including the</strong> <code spellcheck="false">~</code> <strong>prefix</strong> (e.g.
|
||||
<code
|
||||
spellcheck="false">~status</code>).</li>
|
||||
<li>
|
||||
<p>Optionally, use <a class="reference-link" href="#root/_help_OFXdgB2nNk1F">Promoted Attributes</a> for
|
||||
easy status change within the note:</p><pre><code class="language-text-x-trilium-auto">#relation:status(inheritable)="promoted,alias=Status,single"</code></pre>
|
||||
</li>
|
||||
spellcheck="false">~status</code>).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Optionally, use <a class="reference-link" href="#root/_help_OFXdgB2nNk1F">Promoted Attributes</a> for
|
||||
easy status change within the note:</p><pre><code class="language-text-x-trilium-auto">#relation:status(inheritable)="promoted,alias=Status,single"</code></pre>
|
||||
</li>
|
||||
</ol>
|
||||
7
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html
generated
vendored
@@ -30,16 +30,15 @@
|
||||
functionality:</p>
|
||||
<ul>
|
||||
<li>The table of contents of the PDF will reflect the structure of the notes.</li>
|
||||
<li
|
||||
>Reference and inline links to other notes within the same hierarchy will
|
||||
<li>Reference and inline links to other notes within the same hierarchy will
|
||||
be functional (will jump to the corresponding page). If a link refers to
|
||||
a note that is not in the printed hierarchy, it will be unlinked.</li>
|
||||
</ul>
|
||||
<h2>Expanding and collapsing multiple notes at once</h2>
|
||||
<p>Apart from individually expanding or collapsing notes, it's also possible
|
||||
to expand or collapse them all at once. To do so, go to the <a class="reference-link"
|
||||
href="#root/pOsGYCXsbNQG/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a> and
|
||||
look for the corresponding button.</p>
|
||||
href="#root/_help_CssoWBu8I7jF">Collection Properties</a> and look for the
|
||||
corresponding button.</p>
|
||||
<p>By default, the <em>Expand</em> button will only expand the direct children
|
||||
(first level) of the collection. Starting with v0.100.0, it's possible
|
||||
to expand multiple levels of notes using the arrow button next to the button.</p>
|
||||
|
||||
34
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Presentation.html
generated
vendored
@@ -12,21 +12,19 @@
|
||||
<ul>
|
||||
<li>Each slide is a child note of the collection.</li>
|
||||
<li>The order of the child notes determines the order of the slides.</li>
|
||||
<li
|
||||
>Unlike traditional presentation software, slides can be laid out both
|
||||
<li>Unlike traditional presentation software, slides can be laid out both
|
||||
horizontally and vertically (see belwo for more information).</li>
|
||||
<li>Direct children will be laid out horizontally and the children of those
|
||||
will be laid out vertically. Children deeper than two levels of nesting
|
||||
are ignored.</li>
|
||||
<li>Direct children will be laid out horizontally and the children of those
|
||||
will be laid out vertically. Children deeper than two levels of nesting
|
||||
are ignored.</li>
|
||||
</ul>
|
||||
<h2>Interaction and navigation</h2>
|
||||
<p>In the floating buttons section (top-right):</p>
|
||||
<ul>
|
||||
<li>Edit button to go to the corresponding note of the current slide.</li>
|
||||
<li
|
||||
>Press Overview button (or the <kbd>O</kbd> key) to show a birds-eye view
|
||||
<li>Press Overview button (or the <kbd>O</kbd> key) to show a birds-eye view
|
||||
of the slides. Press the button again to disable it.</li>
|
||||
<li>Press the “Start presentation” button to show the presentation in full-screen.</li>
|
||||
<li>Press the “Start presentation” button to show the presentation in full-screen.</li>
|
||||
</ul>
|
||||
<p>The following keyboard shortcuts are supported:</p>
|
||||
<ul>
|
||||
@@ -88,11 +86,10 @@
|
||||
<p>At collection level, it's possible to adjust:</p>
|
||||
<ul>
|
||||
<li>The theme of the entire presentation to one of the predefined themes by
|
||||
going to the <a class="reference-link" href="#root/pOsGYCXsbNQG/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a> and
|
||||
going to the <a class="reference-link" href="#root/_help_CssoWBu8I7jF">Collection Properties</a> and
|
||||
looking for the <em>Theme</em> option.</li>
|
||||
<li>It's currently not possible to create custom themes, although it is planned.</li>
|
||||
<li
|
||||
>Note that it is note possible to alter the CSS via <a class="reference-link"
|
||||
<li>Note that it is note possible to alter the CSS via <a class="reference-link"
|
||||
href="#root/_help_AlhDUqhENtH7">Custom app-wide CSS</a> because the slides
|
||||
are rendered isolated (in a shadow DOM).</li>
|
||||
</ul>
|
||||
@@ -111,8 +108,7 @@
|
||||
<ul>
|
||||
<li>Text notes generally respect the formatting (bold, italic, foreground
|
||||
and background colors) and font size. Code blocks and tables also work.</li>
|
||||
<li
|
||||
>Try using more than just text notes, the presentation uses the same mechanism
|
||||
<li>Try using more than just text notes, the presentation uses the same mechanism
|
||||
as <a href="#root/_help_R9pX4DGra2Vt">shared notes</a> and <a class="reference-link"
|
||||
href="#root/_help_0ESUbbAxVnoK">Note List</a> so it should be able to display
|
||||
<a
|
||||
@@ -120,10 +116,12 @@
|
||||
<a
|
||||
class="reference-link" href="#root/_help_gBbsAeiuUxI5">Mind Map</a> in full-screen (without the interactivity).
|
||||
<ul>
|
||||
<li>Consider using a transparent background for <a class="reference-link"
|
||||
href="#root/_help_grjYqerjn243">Canvas</a>, if the slides have a custom background
|
||||
(go to the hamburger menu in the Canvas, press the button select a custom
|
||||
color and write <code spellcheck="false">transparent</code>).</li>
|
||||
<li>
|
||||
<p>Consider using a transparent background for <a class="reference-link"
|
||||
href="#root/_help_grjYqerjn243">Canvas</a>, if the slides have a custom background
|
||||
(go to the hamburger menu in the Canvas, press the button select a custom
|
||||
color and write <code spellcheck="false">transparent</code>).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>For <a class="reference-link" href="#root/_help_s1aBHPd79XYj">Mermaid Diagrams</a>,
|
||||
some of them have a predefined background which can be changed via the
|
||||
@@ -135,7 +133,7 @@ config:
|
||||
---</code></pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Under the hood</h2>
|
||||
<p>The Presentation view uses <a href="https://revealjs.com/">Reveal.js</a> to
|
||||
|
||||
39
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Table.html
generated
vendored
@@ -46,8 +46,7 @@
|
||||
<ul>
|
||||
<li>Press <em>Add new column</em> at the bottom of the table.</li>
|
||||
<li>Right click on an existing column and select Add column to the left/right.</li>
|
||||
<li
|
||||
>Right click on the empty space of the column header and select <em>Label</em> or <em>Relation</em> in
|
||||
<li>Right click on the empty space of the column header and select <em>Label</em> or <em>Relation</em> in
|
||||
the <em>New column</em> section.</li>
|
||||
</ul>
|
||||
<h3>Adding new rows</h3>
|
||||
@@ -67,11 +66,10 @@
|
||||
<ul>
|
||||
<li>Sorting by the selected column and resetting the sort.</li>
|
||||
<li>Hiding the selected column or adjusting the visibility of every column.</li>
|
||||
<li
|
||||
>Adding new columns to the left or the right of the column.</li>
|
||||
<li>Editing the current column.</li>
|
||||
<li>Deleting the current column.</li>
|
||||
</ul>
|
||||
<li>Adding new columns to the left or the right of the column.</li>
|
||||
<li>Editing the current column.</li>
|
||||
<li>Deleting the current column.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Right clicking on the space to the right of the columns, allows:
|
||||
<ul>
|
||||
@@ -97,16 +95,15 @@
|
||||
<ul>
|
||||
<li>The editing will respect the type of the promoted attribute, by presenting
|
||||
a normal text box, a number selector or a date selector for example.</li>
|
||||
<li
|
||||
>It also possible to change the title of a note.</li>
|
||||
<li>Editing relations is also possible
|
||||
<ul>
|
||||
<li>Simply click on a relation and it will become editable. Enter the text
|
||||
to look for a note and click on it.</li>
|
||||
<li>To remove a relation, remove the title of the note from the text box and
|
||||
click outside the cell.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>It also possible to change the title of a note.</li>
|
||||
<li>Editing relations is also possible
|
||||
<ul>
|
||||
<li>Simply click on a relation and it will become editable. Enter the text
|
||||
to look for a note and click on it.</li>
|
||||
<li>To remove a relation, remove the title of the note from the text box and
|
||||
click outside the cell.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Editing columns</h3>
|
||||
<p>It is possible to edit a column by right clicking it and selecting <em>Edit column.</em> This
|
||||
@@ -131,8 +128,7 @@
|
||||
<h3>Reordering and hiding columns</h3>
|
||||
<ul>
|
||||
<li>Columns can be reordered by dragging the header of the columns.</li>
|
||||
<li
|
||||
>Columns can be hidden or shown by right clicking on a column and clicking
|
||||
<li>Columns can be hidden or shown by right clicking on a column and clicking
|
||||
the item corresponding to the column.</li>
|
||||
</ul>
|
||||
<h3>Reordering rows</h3>
|
||||
@@ -146,8 +142,7 @@
|
||||
<li>If the parent note has <code spellcheck="false">#sorted</code>, reordering
|
||||
will be disabled.</li>
|
||||
<li>If using nested tables, then reordering will also be disabled.</li>
|
||||
<li
|
||||
>Currently, it's possible to reorder notes even if column sorting is used,
|
||||
<li>Currently, it's possible to reorder notes even if column sorting is used,
|
||||
but the result might be inconsistent.</li>
|
||||
</ul>
|
||||
<h3>Nested trees</h3>
|
||||
@@ -159,7 +154,7 @@
|
||||
to a certain number of levels or even disable it completely. To do so,
|
||||
either:</p>
|
||||
<ul>
|
||||
<li>Go to <a class="reference-link" href="#root/pOsGYCXsbNQG/GTwFsgaA0lCt/_help_CssoWBu8I7jF">Collection Properties</a> and
|
||||
<li>Go to <a class="reference-link" href="#root/_help_CssoWBu8I7jF">Collection Properties</a> and
|
||||
look for the <em>Max nesting depth</em> section.
|
||||
<ul>
|
||||
<li>To disable nesting, type 0 and press Enter.</li>
|
||||
|
||||
@@ -168,12 +168,10 @@
|
||||
"code-notes-title": "ملاحظات برمجية",
|
||||
"visible-launchers-title": "المشغلات المرئية",
|
||||
"user-guide": "دليل المستخدم",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"etapi-title": "ETAPI",
|
||||
"sql-console-history-title": "سجل وحدة تحكم SQL",
|
||||
"launch-bar-templates-title": "قوالب شريط التشغيل",
|
||||
"base-abstract-launcher-title": "المشغل الاساسي المجرد",
|
||||
"llm-chat-title": "الدردشة مع الملاحظات",
|
||||
"localization": "اللغة والمنطقة",
|
||||
"go-to-previous-note-title": "اذهب الى الملاحظة السابقة",
|
||||
"go-to-next-note-title": "اذهب الى الملاحظة التالية",
|
||||
|
||||
@@ -77,7 +77,6 @@
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "Còpia de seguretat",
|
||||
"sync-title": "Sincronització",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"other": "Altres",
|
||||
"advanced-title": "Avançat",
|
||||
"inbox-title": "Safata d'entrada"
|
||||
|
||||
@@ -255,8 +255,6 @@
|
||||
"user-guide": "用户指南",
|
||||
"localization": "语言和区域",
|
||||
"jump-to-note-title": "跳转至...",
|
||||
"llm-chat-title": "与笔记聊天",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"inbox-title": "收件箱",
|
||||
"command-palette": "打开命令面板",
|
||||
"zen-mode": "禅模式",
|
||||
|
||||
@@ -251,9 +251,7 @@
|
||||
"visible-launchers-title": "Sichtbare Starter",
|
||||
"user-guide": "Nutzerhandbuch",
|
||||
"jump-to-note-title": "Springe zu...",
|
||||
"llm-chat-title": "Chat mit Notizen",
|
||||
"multi-factor-authentication-title": "MFA",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"localization": "Sprache & Region",
|
||||
"inbox-title": "Posteingang",
|
||||
"zen-mode": "Zen-Modus",
|
||||
|
||||
@@ -337,7 +337,6 @@
|
||||
"protected-session-title": "Protected Session",
|
||||
"sync-status-title": "Sync Status",
|
||||
"settings-title": "Settings",
|
||||
"llm-chat-title": "Chat with Notes",
|
||||
"options-title": "Options",
|
||||
"appearance-title": "Appearance",
|
||||
"shortcuts-title": "Shortcuts",
|
||||
@@ -350,7 +349,6 @@
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "Backup",
|
||||
"sync-title": "Sync",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"other": "Other",
|
||||
"advanced-title": "Advanced",
|
||||
"visible-launchers-title": "Visible Launchers",
|
||||
|
||||
@@ -237,7 +237,6 @@
|
||||
"protected-session-title": "Sesión protegida",
|
||||
"sync-status-title": "Sincronizar estado",
|
||||
"settings-title": "Ajustes",
|
||||
"llm-chat-title": "Chat con notas",
|
||||
"options-title": "Opciones",
|
||||
"appearance-title": "Apariencia",
|
||||
"shortcuts-title": "Atajos",
|
||||
@@ -250,7 +249,6 @@
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "Respaldo",
|
||||
"sync-title": "Sincronizar",
|
||||
"ai-llm-title": "IA/LLM",
|
||||
"other": "Otros",
|
||||
"advanced-title": "Avanzado",
|
||||
"visible-launchers-title": "Lanzadores visibles",
|
||||
|
||||
@@ -1,442 +1,440 @@
|
||||
{
|
||||
"keyboard_actions": {
|
||||
"open-jump-to-note-dialog": "Ouvrir la boîte de dialogue \"Aller à la note\"",
|
||||
"search-in-subtree": "Rechercher des notes dans les sous-arbres de la note active",
|
||||
"expand-subtree": "Développer le sous-arbre de la note actuelle",
|
||||
"collapse-tree": "Réduire toute l'arborescence des notes",
|
||||
"collapse-subtree": "Réduire le sous-arbre de la note actuelle",
|
||||
"sort-child-notes": "Trier les notes enfants",
|
||||
"creating-and-moving-notes": "Créer et déplacer des notes",
|
||||
"create-note-into-inbox": "Créer une note dans l'emplacement par défaut (si défini) ou une note journalière",
|
||||
"delete-note": "Supprimer la note",
|
||||
"move-note-up": "Déplacer la note vers le haut",
|
||||
"move-note-down": "Déplacer la note vers le bas",
|
||||
"move-note-up-in-hierarchy": "Déplacer la note vers le haut dans la hiérarchie",
|
||||
"move-note-down-in-hierarchy": "Déplacer la note vers le bas dans la hiérarchie",
|
||||
"edit-note-title": "Passer de l'arborescence aux détails d'une note et éditer le titre",
|
||||
"edit-branch-prefix": "Afficher la fenêtre Éditer le préfixe de branche",
|
||||
"note-clipboard": "Note presse-papiers",
|
||||
"copy-notes-to-clipboard": "Copier les notes sélectionnées dans le presse-papiers",
|
||||
"paste-notes-from-clipboard": "Coller les notes depuis le presse-papiers dans la note active",
|
||||
"cut-notes-to-clipboard": "Couper les notes sélectionnées dans le presse-papiers",
|
||||
"select-all-notes-in-parent": "Sélectionner toutes les notes du niveau de la note active",
|
||||
"add-note-above-to-the-selection": "Ajouter la note au-dessus de la sélection",
|
||||
"add-note-below-to-selection": "Ajouter la note en dessous de la sélection",
|
||||
"duplicate-subtree": "Dupliquer le sous-arbre",
|
||||
"tabs-and-windows": "Onglets et fenêtres",
|
||||
"open-new-tab": "Ouvrir un nouvel onglet",
|
||||
"close-active-tab": "Fermer l'onglet actif",
|
||||
"reopen-last-tab": "Rouvrir le dernier onglet fermé",
|
||||
"activate-next-tab": "Basculer vers l'onglet à droite de l'onglet actif",
|
||||
"activate-previous-tab": "Basculer vers l'onglet à gauche de l'onglet actif",
|
||||
"open-new-window": "Ouvrir une nouvelle fenêtre vide",
|
||||
"toggle-tray": "Afficher/masquer l'application dans la barre des tâches",
|
||||
"first-tab": "Basculer vers le premier onglet dans la liste",
|
||||
"second-tab": "Basculer vers le deuxième onglet dans la liste",
|
||||
"third-tab": "Basculer vers le troisième onglet dans la liste",
|
||||
"fourth-tab": "Basculer vers le quatrième onglet dans la liste",
|
||||
"fifth-tab": "Basculer vers le cinquième onglet dans la liste",
|
||||
"sixth-tab": "Basculer vers le sixième onglet dans la liste",
|
||||
"seventh-tab": "Basculer vers le septième onglet dans la liste",
|
||||
"eight-tab": "Basculer vers le huitième onglet dans la liste",
|
||||
"ninth-tab": "Basculer vers le neuvième onglet dans la liste",
|
||||
"last-tab": "Basculer vers le dernier onglet dans la liste",
|
||||
"dialogs": "Boîtes de dialogue",
|
||||
"show-note-source": "Affiche la boîte de dialogue Source de la note",
|
||||
"show-options": "Afficher les Options",
|
||||
"show-revisions": "Afficher la boîte de dialogue Versions de la note",
|
||||
"show-recent-changes": "Afficher la boîte de dialogue Modifications récentes",
|
||||
"show-sql-console": "Afficher la boîte de dialogue Console SQL",
|
||||
"show-backend-log": "Afficher la boîte de dialogue Journal du backend",
|
||||
"text-note-operations": "Opérations sur les notes textuelles",
|
||||
"add-link-to-text": "Ouvrir la boîte de dialogue pour ajouter un lien dans le texte",
|
||||
"follow-link-under-cursor": "Suivre le lien sous le curseur",
|
||||
"insert-date-and-time-to-text": "Insérer la date et l'heure dans le texte",
|
||||
"paste-markdown-into-text": "Coller du texte au format Markdown dans la note depuis le presse-papiers",
|
||||
"cut-into-note": "Couper la sélection depuis la note actuelle et créer une sous-note avec le texte sélectionné",
|
||||
"add-include-note-to-text": "Ouvrir la boîte de dialogue pour Inclure une note",
|
||||
"edit-readonly-note": "Éditer une note en lecture seule",
|
||||
"attributes-labels-and-relations": "Attributs (labels et relations)",
|
||||
"add-new-label": "Créer un nouveau label",
|
||||
"create-new-relation": "Créer une nouvelle relation",
|
||||
"ribbon-tabs": "Onglets du ruban",
|
||||
"toggle-basic-properties": "Afficher/masquer les Propriétés de base de la note",
|
||||
"toggle-file-properties": "Afficher/masquer les Propriétés du fichier",
|
||||
"toggle-image-properties": "Afficher/masquer les Propriétés de l'image",
|
||||
"toggle-owned-attributes": "Afficher/masquer les Attributs propres",
|
||||
"toggle-inherited-attributes": "Afficher/masquer les Attributs hérités",
|
||||
"toggle-promoted-attributes": "Afficher/masquer les Attributs promus",
|
||||
"toggle-link-map": "Afficher/masquer la Carte de la note",
|
||||
"toggle-note-info": "Afficher/masquer les Informations de la note",
|
||||
"toggle-note-paths": "Afficher/masquer les Emplacements de la note",
|
||||
"toggle-similar-notes": "Afficher/masquer les Notes similaires",
|
||||
"other": "Autre",
|
||||
"toggle-right-pane": "Afficher/masquer le volet droit, qui inclut la Table des matières et les Accentuations",
|
||||
"print-active-note": "Imprimer la note active",
|
||||
"open-note-externally": "Ouvrir la note comme fichier avec l'application par défaut",
|
||||
"render-active-note": "Rendre (ou re-rendre) la note active",
|
||||
"run-active-note": "Exécuter le code JavaScript (frontend/backend) de la note active",
|
||||
"toggle-note-hoisting": "Activer le focus sur la note active",
|
||||
"unhoist": "Désactiver tout focus",
|
||||
"reload-frontend-app": "Recharger l'application",
|
||||
"open-dev-tools": "Ouvrir les outils de développement",
|
||||
"toggle-left-note-tree-panel": "Basculer le panneau gauche (arborescence des notes)",
|
||||
"toggle-full-screen": "Basculer en plein écran",
|
||||
"zoom-out": "Dézoomer",
|
||||
"zoom-in": "Zoomer",
|
||||
"note-navigation": "Navigation dans les notes",
|
||||
"reset-zoom-level": "Réinitialiser le niveau de zoom",
|
||||
"copy-without-formatting": "Copier le texte sélectionné sans mise en forme",
|
||||
"force-save-revision": "Forcer la création / sauvegarde d'une nouvelle version de la note active",
|
||||
"show-help": "Affiche le guide de l'utilisateur intégré",
|
||||
"toggle-book-properties": "Afficher/masquer les Propriétés du Livre",
|
||||
"toggle-classic-editor-toolbar": "Activer/désactiver l'onglet Mise en forme de l'éditeur avec la barre d'outils fixe",
|
||||
"export-as-pdf": "Exporte la note actuelle en PDF",
|
||||
"show-cheatsheet": "Affiche une fenêtre modale avec des opérations de clavier courantes",
|
||||
"toggle-zen-mode": "Active/désactive le mode zen (interface réduite pour favoriser la concentration)",
|
||||
"back-in-note-history": "Naviguer à la note précédente dans l'historique",
|
||||
"forward-in-note-history": "Naviguer a la note suivante dans l'historique",
|
||||
"open-command-palette": "Ouvrir la palette de commandes",
|
||||
"clone-notes-to": "Cloner les nœuds sélectionnés",
|
||||
"move-notes-to": "Déplacer les nœuds sélectionnés",
|
||||
"scroll-to-active-note": "Faire défiler l’arborescence des notes jusqu’à la note active",
|
||||
"quick-search": "Activer la barre de recherche rapide",
|
||||
"create-note-after": "Créer une note après la note active",
|
||||
"create-note-into": "Créer une note enfant de la note active",
|
||||
"find-in-text": "Afficher/Masquer le panneau de recherche"
|
||||
},
|
||||
"login": {
|
||||
"title": "Connexion",
|
||||
"heading": "Connexion à Trilium",
|
||||
"incorrect-password": "Le mot de passe est incorrect. Veuillez réessayer.",
|
||||
"password": "Mot de passe",
|
||||
"remember-me": "Se souvenir de moi",
|
||||
"button": "Connexion",
|
||||
"sign_in_with_sso": "Se connecter avec {{ ssoIssuerName }}",
|
||||
"incorrect-totp": "TOTP incorrect. Veuillez réessayer."
|
||||
},
|
||||
"set_password": {
|
||||
"title": "Définir un mot de passe",
|
||||
"heading": "Définir un mot de passe",
|
||||
"description": "Avant de pouvoir commencer à utiliser Trilium depuis le web, vous devez d'abord définir un mot de passe. Vous utiliserez ensuite ce mot de passe pour vous connecter.",
|
||||
"password": "Mot de passe",
|
||||
"password-confirmation": "Confirmation du mot de passe",
|
||||
"button": "Définir le mot de passe"
|
||||
},
|
||||
"setup": {
|
||||
"heading": "Configuration de Trilium Notes",
|
||||
"new-document": "Je suis un nouvel utilisateur et je souhaite créer un nouveau document Trilium pour mes notes",
|
||||
"sync-from-desktop": "J'ai déjà l'application de bureau et je souhaite configurer la synchronisation avec celle-ci",
|
||||
"sync-from-server": "J'ai déjà un serveur et je souhaite configurer la synchronisation avec celui-ci",
|
||||
"next": "Suivant",
|
||||
"init-in-progress": "Initialisation du document en cours",
|
||||
"redirecting": "Vous serez bientôt redirigé vers l'application.",
|
||||
"title": "Configuration"
|
||||
},
|
||||
"setup_sync-from-desktop": {
|
||||
"heading": "Synchroniser depuis une application de bureau",
|
||||
"description": "Cette procédure doit être réalisée depuis l'application de bureau :",
|
||||
"step1": "Ouvrez l'application Trilium Notes.",
|
||||
"step2": "Dans le menu Trilium, cliquez sur Options.",
|
||||
"step3": "Cliquez sur la catégorie Synchroniser.",
|
||||
"step4": "Remplacez l'adresse de l'instance de serveur par : {{- host}} et cliquez sur Enregistrer.",
|
||||
"step5": "Cliquez sur le bouton 'Tester la synchronisation' pour vérifier que la connexion fonctionne.",
|
||||
"step6": "Une fois que vous avez terminé ces étapes, cliquez sur {{- link}}.",
|
||||
"step6-here": "ici"
|
||||
},
|
||||
"setup_sync-from-server": {
|
||||
"heading": "Synchroniser depuis le serveur",
|
||||
"instructions": "Veuillez saisir l'adresse du serveur Trilium et les informations d'identification ci-dessous. Cela téléchargera l'intégralité du document Trilium à partir du serveur et configurera la synchronisation avec celui-ci. En fonction de la taille du document et de votre vitesse de connexion, cela peut prendre un plusieurs minutes.",
|
||||
"server-host": "Adresse du serveur Trilium",
|
||||
"server-host-placeholder": "https://<nom d'hôte>:<port>",
|
||||
"proxy-server": "Serveur proxy (facultatif)",
|
||||
"proxy-server-placeholder": "https://<nom d'hôte>:<port>",
|
||||
"note": "Note :",
|
||||
"proxy-instruction": "Si vous laissez le paramètre de proxy vide, le proxy du système sera utilisé (s'applique uniquement à l'application de bureau)",
|
||||
"password": "Mot de passe",
|
||||
"password-placeholder": "Mot de passe",
|
||||
"back": "Retour",
|
||||
"finish-setup": "Terminer"
|
||||
},
|
||||
"setup_sync-in-progress": {
|
||||
"heading": "Synchronisation en cours",
|
||||
"successful": "La synchronisation a été correctement configurée. La synchronisation initiale prendra un certain temps. Une fois terminée, vous serez redirigé vers la page de connexion.",
|
||||
"outstanding-items": "Éléments de synchronisation exceptionnels :",
|
||||
"outstanding-items-default": "N/A"
|
||||
},
|
||||
"share_404": {
|
||||
"title": "Page non trouvée",
|
||||
"heading": "Page non trouvée"
|
||||
},
|
||||
"share_page": {
|
||||
"parent": "parent :",
|
||||
"clipped-from": "Cette note a été initialement extraite de {{- url}}",
|
||||
"child-notes": "Notes enfants :",
|
||||
"no-content": "Cette note n'a aucun contenu."
|
||||
},
|
||||
"weekdays": {
|
||||
"monday": "Lundi",
|
||||
"tuesday": "Mardi",
|
||||
"wednesday": "Mercredi",
|
||||
"thursday": "Jeudi",
|
||||
"friday": "Vendredi",
|
||||
"saturday": "Samedi",
|
||||
"sunday": "Dimanche"
|
||||
},
|
||||
"months": {
|
||||
"january": "Janvier",
|
||||
"february": "Février",
|
||||
"march": "Mars",
|
||||
"april": "Avril",
|
||||
"may": "Mai",
|
||||
"june": "Juin",
|
||||
"july": "Juillet",
|
||||
"august": "Août",
|
||||
"september": "Septembre",
|
||||
"october": "Octobre",
|
||||
"november": "Novembre",
|
||||
"december": "Décembre"
|
||||
},
|
||||
"special_notes": {
|
||||
"search_prefix": "Recherche :"
|
||||
},
|
||||
"test_sync": {
|
||||
"not-configured": "L'hôte du serveur de synchronisation n'est pas configuré. Veuillez d'abord configurer la synchronisation.",
|
||||
"successful": "L'établissement de liaison du serveur de synchronisation a été réussi, la synchronisation a été démarrée."
|
||||
},
|
||||
"hidden-subtree": {
|
||||
"root-title": "Notes cachées",
|
||||
"search-history-title": "Historique de recherche",
|
||||
"note-map-title": "Carte de la Note",
|
||||
"sql-console-history-title": "Historique de la console SQL",
|
||||
"shared-notes-title": "Notes partagées",
|
||||
"bulk-action-title": "Action groupée",
|
||||
"backend-log-title": "Journal Backend",
|
||||
"user-hidden-title": "Utilisateur masqué",
|
||||
"launch-bar-templates-title": "Modèles de barre de raccourcis",
|
||||
"base-abstract-launcher-title": "Raccourci Base abstraite",
|
||||
"command-launcher-title": "Raccourci Commande",
|
||||
"note-launcher-title": "Raccourci Note",
|
||||
"script-launcher-title": "Raccourci Script",
|
||||
"built-in-widget-title": "Widget intégré",
|
||||
"spacer-title": "Séparateur",
|
||||
"custom-widget-title": "Widget personnalisé",
|
||||
"launch-bar-title": "Barre de lancement",
|
||||
"available-launchers-title": "Raccourcis disponibles",
|
||||
"go-to-previous-note-title": "Aller à la note précédente",
|
||||
"go-to-next-note-title": "Aller à la note suivante",
|
||||
"new-note-title": "Nouvelle note",
|
||||
"search-notes-title": "Rechercher des notes",
|
||||
"calendar-title": "Calendrier",
|
||||
"recent-changes-title": "Modifications récentes",
|
||||
"bookmarks-title": "Signets",
|
||||
"open-today-journal-note-title": "Ouvrir la note du journal du jour",
|
||||
"quick-search-title": "Recherche rapide",
|
||||
"protected-session-title": "Session protégée",
|
||||
"sync-status-title": "État de la synchronisation",
|
||||
"settings-title": "Réglages",
|
||||
"options-title": "Options",
|
||||
"appearance-title": "Apparence",
|
||||
"shortcuts-title": "Raccourcis",
|
||||
"text-notes": "Notes de texte",
|
||||
"code-notes-title": "Notes de code",
|
||||
"images-title": "Images",
|
||||
"spellcheck-title": "Correcteur orthographique",
|
||||
"password-title": "Mot de passe",
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "Sauvegarde",
|
||||
"sync-title": "Synchronisation",
|
||||
"other": "Autre",
|
||||
"advanced-title": "Avancé",
|
||||
"visible-launchers-title": "Raccourcis visibles",
|
||||
"user-guide": "Guide de l'utilisateur",
|
||||
"jump-to-note-title": "Aller à...",
|
||||
"llm-chat-title": "Discuter avec Notes",
|
||||
"multi-factor-authentication-title": "MFA",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"localization": "Langue et région",
|
||||
"inbox-title": "Boîte de réception",
|
||||
"command-palette": "Ouvrir la palette de commandes",
|
||||
"zen-mode": "Mode Zen"
|
||||
},
|
||||
"notes": {
|
||||
"new-note": "Nouvelle note",
|
||||
"duplicate-note-suffix": "(dup)",
|
||||
"duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}"
|
||||
},
|
||||
"backend_log": {
|
||||
"log-does-not-exist": "Le fichier journal '{{ fileName }}' n'existe pas (encore).",
|
||||
"reading-log-failed": "La lecture du fichier journal d'administration '{{ fileName }}' a échoué."
|
||||
},
|
||||
"content_renderer": {
|
||||
"note-cannot-be-displayed": "Ce type de note ne peut pas être affiché."
|
||||
},
|
||||
"pdf": {
|
||||
"export_filter": "Document PDF (*.pdf)",
|
||||
"unable-to-export-message": "La note actuelle n'a pas pu être exportée en format PDF.",
|
||||
"unable-to-export-title": "Impossible d'exporter au format PDF",
|
||||
"unable-to-save-message": "Le fichier sélectionné n'a pas pu être écrit. Réessayez ou sélectionnez une autre destination.",
|
||||
"unable-to-print": "Impossible d'imprimer la note"
|
||||
},
|
||||
"tray": {
|
||||
"tooltip": "Trilium Notes",
|
||||
"close": "Quitter Trilium",
|
||||
"recents": "Notes récentes",
|
||||
"bookmarks": "Signets",
|
||||
"today": "Ouvrir la note du journal du jour",
|
||||
"new-note": "Nouvelle note",
|
||||
"show-windows": "Afficher les fenêtres",
|
||||
"open_new_window": "Ouvrir une nouvelle fenêtre"
|
||||
},
|
||||
"migration": {
|
||||
"old_version": "La migration directe à partir de votre version actuelle n'est pas prise en charge. Veuillez d'abord mettre à jour vers la version v0.60.4, puis vers cette nouvelle version.",
|
||||
"error_message": "Erreur lors de la migration vers la version {{version}}: {{stack}}",
|
||||
"wrong_db_version": "La version de la base de données ({{version}}) est plus récente que ce que l'application supporte actuellement ({{targetVersion}}), ce qui signifie qu'elle a été créée par une version plus récente et incompatible de Trilium. Mettez à jour vers la dernière version de Trilium pour résoudre ce problème."
|
||||
},
|
||||
"modals": {
|
||||
"error_title": "Erreur"
|
||||
},
|
||||
"keyboard_action_names": {
|
||||
"command-palette": "Palette de commandes",
|
||||
"quick-search": "Recherche rapide",
|
||||
"back-in-note-history": "Revenir dans l’historique des notes",
|
||||
"forward-in-note-history": "Suivant dans l’historique des notes",
|
||||
"jump-to-note": "Aller à…",
|
||||
"scroll-to-active-note": "Faire défiler jusqu’à la note active",
|
||||
"search-in-subtree": "Rechercher dans la sous-arborescence",
|
||||
"expand-subtree": "Développer la sous-arborescence",
|
||||
"collapse-tree": "Réduire l’arborescence",
|
||||
"collapse-subtree": "Réduire la sous-arborescence",
|
||||
"sort-child-notes": "Trier les notes enfants",
|
||||
"create-note-after": "Créer une note après",
|
||||
"create-note-into": "Créer une note dans",
|
||||
"create-note-into-inbox": "Créer une note dans Inbox",
|
||||
"delete-notes": "Supprimer les notes",
|
||||
"move-note-up": "Remonter la note",
|
||||
"move-note-down": "Descendre la note",
|
||||
"move-note-up-in-hierarchy": "Monter la note dans la hiérarchie",
|
||||
"move-note-down-in-hierarchy": "Descendre la note dans la hiérarchie",
|
||||
"edit-note-title": "Modifier le titre de la note",
|
||||
"edit-branch-prefix": "Modifier le préfixe de la branche",
|
||||
"clone-notes-to": "Cloner les notes vers",
|
||||
"move-notes-to": "Déplacer les notes vers",
|
||||
"copy-notes-to-clipboard": "Copier les notes dans le presse-papiers",
|
||||
"paste-notes-from-clipboard": "Coller les notes depuis le presse-papiers",
|
||||
"cut-notes-to-clipboard": "Couper les notes vers le presse-papier",
|
||||
"select-all-notes-in-parent": "Selectionner toutes les notes dans le parent",
|
||||
"add-note-above-to-selection": "Ajouter la note au-dessus à la selection",
|
||||
"add-note-below-to-selection": "Ajouter la note dessous à la selection",
|
||||
"duplicate-subtree": "Dupliquer la sous-arborescence",
|
||||
"open-new-tab": "Ouvrir un nouvel onglet",
|
||||
"close-active-tab": "Fermer l'onglet actif",
|
||||
"reopen-last-tab": "Réouvrir le dernier onglet",
|
||||
"activate-next-tab": "Activer l'onglet suivant",
|
||||
"activate-previous-tab": "Activer l'onglet précédent",
|
||||
"open-new-window": "Ouvrir une nouvelle fenêtre",
|
||||
"toggle-system-tray-icon": "Activer/Désactiver l'icone de la barre d'état",
|
||||
"toggle-zen-mode": "Activer/Désactiver le mode Zen",
|
||||
"switch-to-first-tab": "Aller au premier onglet",
|
||||
"switch-to-second-tab": "Aller au second onglet",
|
||||
"switch-to-third-tab": "Aller au troisième onglet",
|
||||
"switch-to-fourth-tab": "Aller au quatrième onglet",
|
||||
"switch-to-fifth-tab": "Aller au cinquième onglet",
|
||||
"switch-to-sixth-tab": "Aller au sixième onglet",
|
||||
"switch-to-seventh-tab": "Aller au septième onglet",
|
||||
"switch-to-eighth-tab": "Aller au huitième onglet",
|
||||
"switch-to-ninth-tab": "Aller au neuvième onglet",
|
||||
"switch-to-last-tab": "Aller au dernier onglet",
|
||||
"show-note-source": "Afficher la source de la note",
|
||||
"show-options": "Afficher les options",
|
||||
"show-revisions": "Afficher les révisions",
|
||||
"show-recent-changes": "Afficher les changements récents",
|
||||
"show-sql-console": "Afficher la console SQL",
|
||||
"show-backend-log": "Afficher le journal du backend",
|
||||
"show-help": "Afficher l'aide",
|
||||
"show-cheatsheet": "Afficher la fiche de triche",
|
||||
"add-link-to-text": "Ajouter un lien au texte",
|
||||
"follow-link-under-cursor": "Suivre le lien en dessous du curseur",
|
||||
"insert-date-and-time-to-text": "Insérer la date et l'heure dans le texte",
|
||||
"paste-markdown-into-text": "Coller du Markdown dans le texte",
|
||||
"cut-into-note": "Couper dans une note",
|
||||
"add-include-note-to-text": "Ajouter une note inclusion au texte",
|
||||
"edit-read-only-note": "Modifier une note en lecture seule",
|
||||
"add-new-label": "Ajouter une nouvelle étiquette",
|
||||
"add-new-relation": "Ajouter une nouvelle relation",
|
||||
"toggle-ribbon-tab-classic-editor": "Basculer l'onglet Mise en forme de l'éditeur avec la barre d'outils fixe",
|
||||
"toggle-ribbon-tab-basic-properties": "Afficher/masquer les Propriétés de base de la note",
|
||||
"toggle-ribbon-tab-book-properties": "Afficher/masquer les Propriétés du Livre",
|
||||
"toggle-ribbon-tab-file-properties": "Afficher/masquer les Propriétés du fichier",
|
||||
"toggle-ribbon-tab-image-properties": "Afficher/masquer les Propriétés de l'image",
|
||||
"toggle-ribbon-tab-owned-attributes": "Afficher/masquer les Attributs propres",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Afficher/masquer les Attributs hérités",
|
||||
"toggle-right-pane": "Afficher le panneau de droite",
|
||||
"print-active-note": "Imprimer la note active",
|
||||
"export-active-note-as-pdf": "Exporter la note active en PDF",
|
||||
"open-note-externally": "Ouvrir la note à l'extérieur",
|
||||
"render-active-note": "Faire un rendu de la note active",
|
||||
"run-active-note": "Lancer la note active",
|
||||
"reload-frontend-app": "Recharger l'application Frontend",
|
||||
"open-developer-tools": "Ouvrir les outils développeur",
|
||||
"find-in-text": "Chercher un texte",
|
||||
"toggle-left-pane": "Afficher le panneau de gauche",
|
||||
"toggle-full-screen": "Passer en mode plein écran",
|
||||
"zoom-out": "Dézoomer",
|
||||
"zoom-in": "Zoomer",
|
||||
"reset-zoom-level": "Réinitilaliser le zoom",
|
||||
"copy-without-formatting": "Copier sans mise en forme",
|
||||
"force-save-revision": "Forcer la sauvegarde de la révision",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Basculer les attributs promus de l'onglet du ruban",
|
||||
"toggle-ribbon-tab-note-map": "Basculer l'onglet du ruban Note Map",
|
||||
"toggle-ribbon-tab-note-info": "Basculer l'onglet du ruban Note Info",
|
||||
"toggle-ribbon-tab-note-paths": "Basculer les chemins de notes de l'onglet du ruban",
|
||||
"toggle-ribbon-tab-similar-notes": "Basculer l'onglet du ruban Notes similaires",
|
||||
"toggle-note-hoisting": "Activer la focalisation sur la note",
|
||||
"unhoist-note": "Désactiver la focalisation sur la note"
|
||||
},
|
||||
"sql_init": {
|
||||
"db_not_initialized_desktop": "Base de données non initialisée, merci de suivre les instructions à l'écran.",
|
||||
"db_not_initialized_server": "Base de données non initialisée, veuillez visitez - http://[your-server-host]:{{port}} pour consulter les instructions d'initialisation de Trilium."
|
||||
},
|
||||
"desktop": {
|
||||
"instance_already_running": "Une instance est déjà en cours d'execution, ouverture de cette instance à la place."
|
||||
},
|
||||
"weekdayNumber": "Semaine {weekNumber}",
|
||||
"quarterNumber": "Trimestre {quarterNumber}",
|
||||
"share_theme": {
|
||||
"site-theme": "Thème du site",
|
||||
"search_placeholder": "Recherche...",
|
||||
"image_alt": "Image de l'article",
|
||||
"last-updated": "Dernière mise à jour le {{- date}}",
|
||||
"subpages": "Sous-pages:",
|
||||
"on-this-page": "Sur cette page",
|
||||
"expand": "Développer"
|
||||
},
|
||||
"hidden_subtree_templates": {
|
||||
"text-snippet": "Extrait de texte",
|
||||
"description": "Description",
|
||||
"list-view": "Vue en liste",
|
||||
"grid-view": "Vue en grille",
|
||||
"calendar": "Calendrier",
|
||||
"table": "Tableau",
|
||||
"geo-map": "Carte géographique",
|
||||
"start-date": "Date de début",
|
||||
"end-date": "Date de fin",
|
||||
"start-time": "Heure de début",
|
||||
"end-time": "Heure de fin",
|
||||
"geolocation": "Géolocalisation",
|
||||
"built-in-templates": "Modèles intégrés",
|
||||
"board": "Tableau de bord",
|
||||
"status": "État",
|
||||
"board_note_first": "Première note",
|
||||
"board_note_second": "Deuxième note",
|
||||
"board_note_third": "Troisième note",
|
||||
"board_status_todo": "A faire",
|
||||
"board_status_progress": "En cours",
|
||||
"board_status_done": "Terminé",
|
||||
"presentation": "Présentation",
|
||||
"presentation_slide": "Diapositive de présentation",
|
||||
"presentation_slide_first": "Première diapositive",
|
||||
"presentation_slide_second": "Deuxième diapositive",
|
||||
"background": "Arrière-plan"
|
||||
}
|
||||
"keyboard_actions": {
|
||||
"open-jump-to-note-dialog": "Ouvrir la boîte de dialogue \"Aller à la note\"",
|
||||
"search-in-subtree": "Rechercher des notes dans les sous-arbres de la note active",
|
||||
"expand-subtree": "Développer le sous-arbre de la note actuelle",
|
||||
"collapse-tree": "Réduire toute l'arborescence des notes",
|
||||
"collapse-subtree": "Réduire le sous-arbre de la note actuelle",
|
||||
"sort-child-notes": "Trier les notes enfants",
|
||||
"creating-and-moving-notes": "Créer et déplacer des notes",
|
||||
"create-note-into-inbox": "Créer une note dans l'emplacement par défaut (si défini) ou une note journalière",
|
||||
"delete-note": "Supprimer la note",
|
||||
"move-note-up": "Déplacer la note vers le haut",
|
||||
"move-note-down": "Déplacer la note vers le bas",
|
||||
"move-note-up-in-hierarchy": "Déplacer la note vers le haut dans la hiérarchie",
|
||||
"move-note-down-in-hierarchy": "Déplacer la note vers le bas dans la hiérarchie",
|
||||
"edit-note-title": "Passer de l'arborescence aux détails d'une note et éditer le titre",
|
||||
"edit-branch-prefix": "Afficher la fenêtre Éditer le préfixe de branche",
|
||||
"note-clipboard": "Note presse-papiers",
|
||||
"copy-notes-to-clipboard": "Copier les notes sélectionnées dans le presse-papiers",
|
||||
"paste-notes-from-clipboard": "Coller les notes depuis le presse-papiers dans la note active",
|
||||
"cut-notes-to-clipboard": "Couper les notes sélectionnées dans le presse-papiers",
|
||||
"select-all-notes-in-parent": "Sélectionner toutes les notes du niveau de la note active",
|
||||
"add-note-above-to-the-selection": "Ajouter la note au-dessus de la sélection",
|
||||
"add-note-below-to-selection": "Ajouter la note en dessous de la sélection",
|
||||
"duplicate-subtree": "Dupliquer le sous-arbre",
|
||||
"tabs-and-windows": "Onglets et fenêtres",
|
||||
"open-new-tab": "Ouvrir un nouvel onglet",
|
||||
"close-active-tab": "Fermer l'onglet actif",
|
||||
"reopen-last-tab": "Rouvrir le dernier onglet fermé",
|
||||
"activate-next-tab": "Basculer vers l'onglet à droite de l'onglet actif",
|
||||
"activate-previous-tab": "Basculer vers l'onglet à gauche de l'onglet actif",
|
||||
"open-new-window": "Ouvrir une nouvelle fenêtre vide",
|
||||
"toggle-tray": "Afficher/masquer l'application dans la barre des tâches",
|
||||
"first-tab": "Basculer vers le premier onglet dans la liste",
|
||||
"second-tab": "Basculer vers le deuxième onglet dans la liste",
|
||||
"third-tab": "Basculer vers le troisième onglet dans la liste",
|
||||
"fourth-tab": "Basculer vers le quatrième onglet dans la liste",
|
||||
"fifth-tab": "Basculer vers le cinquième onglet dans la liste",
|
||||
"sixth-tab": "Basculer vers le sixième onglet dans la liste",
|
||||
"seventh-tab": "Basculer vers le septième onglet dans la liste",
|
||||
"eight-tab": "Basculer vers le huitième onglet dans la liste",
|
||||
"ninth-tab": "Basculer vers le neuvième onglet dans la liste",
|
||||
"last-tab": "Basculer vers le dernier onglet dans la liste",
|
||||
"dialogs": "Boîtes de dialogue",
|
||||
"show-note-source": "Affiche la boîte de dialogue Source de la note",
|
||||
"show-options": "Afficher les Options",
|
||||
"show-revisions": "Afficher la boîte de dialogue Versions de la note",
|
||||
"show-recent-changes": "Afficher la boîte de dialogue Modifications récentes",
|
||||
"show-sql-console": "Afficher la boîte de dialogue Console SQL",
|
||||
"show-backend-log": "Afficher la boîte de dialogue Journal du backend",
|
||||
"text-note-operations": "Opérations sur les notes textuelles",
|
||||
"add-link-to-text": "Ouvrir la boîte de dialogue pour ajouter un lien dans le texte",
|
||||
"follow-link-under-cursor": "Suivre le lien sous le curseur",
|
||||
"insert-date-and-time-to-text": "Insérer la date et l'heure dans le texte",
|
||||
"paste-markdown-into-text": "Coller du texte au format Markdown dans la note depuis le presse-papiers",
|
||||
"cut-into-note": "Couper la sélection depuis la note actuelle et créer une sous-note avec le texte sélectionné",
|
||||
"add-include-note-to-text": "Ouvrir la boîte de dialogue pour Inclure une note",
|
||||
"edit-readonly-note": "Éditer une note en lecture seule",
|
||||
"attributes-labels-and-relations": "Attributs (labels et relations)",
|
||||
"add-new-label": "Créer un nouveau label",
|
||||
"create-new-relation": "Créer une nouvelle relation",
|
||||
"ribbon-tabs": "Onglets du ruban",
|
||||
"toggle-basic-properties": "Afficher/masquer les Propriétés de base de la note",
|
||||
"toggle-file-properties": "Afficher/masquer les Propriétés du fichier",
|
||||
"toggle-image-properties": "Afficher/masquer les Propriétés de l'image",
|
||||
"toggle-owned-attributes": "Afficher/masquer les Attributs propres",
|
||||
"toggle-inherited-attributes": "Afficher/masquer les Attributs hérités",
|
||||
"toggle-promoted-attributes": "Afficher/masquer les Attributs promus",
|
||||
"toggle-link-map": "Afficher/masquer la Carte de la note",
|
||||
"toggle-note-info": "Afficher/masquer les Informations de la note",
|
||||
"toggle-note-paths": "Afficher/masquer les Emplacements de la note",
|
||||
"toggle-similar-notes": "Afficher/masquer les Notes similaires",
|
||||
"other": "Autre",
|
||||
"toggle-right-pane": "Afficher/masquer le volet droit, qui inclut la Table des matières et les Accentuations",
|
||||
"print-active-note": "Imprimer la note active",
|
||||
"open-note-externally": "Ouvrir la note comme fichier avec l'application par défaut",
|
||||
"render-active-note": "Rendre (ou re-rendre) la note active",
|
||||
"run-active-note": "Exécuter le code JavaScript (frontend/backend) de la note active",
|
||||
"toggle-note-hoisting": "Activer le focus sur la note active",
|
||||
"unhoist": "Désactiver tout focus",
|
||||
"reload-frontend-app": "Recharger l'application",
|
||||
"open-dev-tools": "Ouvrir les outils de développement",
|
||||
"toggle-left-note-tree-panel": "Basculer le panneau gauche (arborescence des notes)",
|
||||
"toggle-full-screen": "Basculer en plein écran",
|
||||
"zoom-out": "Dézoomer",
|
||||
"zoom-in": "Zoomer",
|
||||
"note-navigation": "Navigation dans les notes",
|
||||
"reset-zoom-level": "Réinitialiser le niveau de zoom",
|
||||
"copy-without-formatting": "Copier le texte sélectionné sans mise en forme",
|
||||
"force-save-revision": "Forcer la création / sauvegarde d'une nouvelle version de la note active",
|
||||
"show-help": "Affiche le guide de l'utilisateur intégré",
|
||||
"toggle-book-properties": "Afficher/masquer les Propriétés du Livre",
|
||||
"toggle-classic-editor-toolbar": "Activer/désactiver l'onglet Mise en forme de l'éditeur avec la barre d'outils fixe",
|
||||
"export-as-pdf": "Exporte la note actuelle en PDF",
|
||||
"show-cheatsheet": "Affiche une fenêtre modale avec des opérations de clavier courantes",
|
||||
"toggle-zen-mode": "Active/désactive le mode zen (interface réduite pour favoriser la concentration)",
|
||||
"back-in-note-history": "Naviguer à la note précédente dans l'historique",
|
||||
"forward-in-note-history": "Naviguer a la note suivante dans l'historique",
|
||||
"open-command-palette": "Ouvrir la palette de commandes",
|
||||
"clone-notes-to": "Cloner les nœuds sélectionnés",
|
||||
"move-notes-to": "Déplacer les nœuds sélectionnés",
|
||||
"scroll-to-active-note": "Faire défiler l’arborescence des notes jusqu’à la note active",
|
||||
"quick-search": "Activer la barre de recherche rapide",
|
||||
"create-note-after": "Créer une note après la note active",
|
||||
"create-note-into": "Créer une note enfant de la note active",
|
||||
"find-in-text": "Afficher/Masquer le panneau de recherche"
|
||||
},
|
||||
"login": {
|
||||
"title": "Connexion",
|
||||
"heading": "Connexion à Trilium",
|
||||
"incorrect-password": "Le mot de passe est incorrect. Veuillez réessayer.",
|
||||
"password": "Mot de passe",
|
||||
"remember-me": "Se souvenir de moi",
|
||||
"button": "Connexion",
|
||||
"sign_in_with_sso": "Se connecter avec {{ ssoIssuerName }}",
|
||||
"incorrect-totp": "TOTP incorrect. Veuillez réessayer."
|
||||
},
|
||||
"set_password": {
|
||||
"title": "Définir un mot de passe",
|
||||
"heading": "Définir un mot de passe",
|
||||
"description": "Avant de pouvoir commencer à utiliser Trilium depuis le web, vous devez d'abord définir un mot de passe. Vous utiliserez ensuite ce mot de passe pour vous connecter.",
|
||||
"password": "Mot de passe",
|
||||
"password-confirmation": "Confirmation du mot de passe",
|
||||
"button": "Définir le mot de passe"
|
||||
},
|
||||
"setup": {
|
||||
"heading": "Configuration de Trilium Notes",
|
||||
"new-document": "Je suis un nouvel utilisateur et je souhaite créer un nouveau document Trilium pour mes notes",
|
||||
"sync-from-desktop": "J'ai déjà l'application de bureau et je souhaite configurer la synchronisation avec celle-ci",
|
||||
"sync-from-server": "J'ai déjà un serveur et je souhaite configurer la synchronisation avec celui-ci",
|
||||
"next": "Suivant",
|
||||
"init-in-progress": "Initialisation du document en cours",
|
||||
"redirecting": "Vous serez bientôt redirigé vers l'application.",
|
||||
"title": "Configuration"
|
||||
},
|
||||
"setup_sync-from-desktop": {
|
||||
"heading": "Synchroniser depuis une application de bureau",
|
||||
"description": "Cette procédure doit être réalisée depuis l'application de bureau :",
|
||||
"step1": "Ouvrez l'application Trilium Notes.",
|
||||
"step2": "Dans le menu Trilium, cliquez sur Options.",
|
||||
"step3": "Cliquez sur la catégorie Synchroniser.",
|
||||
"step4": "Remplacez l'adresse de l'instance de serveur par : {{- host}} et cliquez sur Enregistrer.",
|
||||
"step5": "Cliquez sur le bouton 'Tester la synchronisation' pour vérifier que la connexion fonctionne.",
|
||||
"step6": "Une fois que vous avez terminé ces étapes, cliquez sur {{- link}}.",
|
||||
"step6-here": "ici"
|
||||
},
|
||||
"setup_sync-from-server": {
|
||||
"heading": "Synchroniser depuis le serveur",
|
||||
"instructions": "Veuillez saisir l'adresse du serveur Trilium et les informations d'identification ci-dessous. Cela téléchargera l'intégralité du document Trilium à partir du serveur et configurera la synchronisation avec celui-ci. En fonction de la taille du document et de votre vitesse de connexion, cela peut prendre un plusieurs minutes.",
|
||||
"server-host": "Adresse du serveur Trilium",
|
||||
"server-host-placeholder": "https://<nom d'hôte>:<port>",
|
||||
"proxy-server": "Serveur proxy (facultatif)",
|
||||
"proxy-server-placeholder": "https://<nom d'hôte>:<port>",
|
||||
"note": "Note :",
|
||||
"proxy-instruction": "Si vous laissez le paramètre de proxy vide, le proxy du système sera utilisé (s'applique uniquement à l'application de bureau)",
|
||||
"password": "Mot de passe",
|
||||
"password-placeholder": "Mot de passe",
|
||||
"back": "Retour",
|
||||
"finish-setup": "Terminer"
|
||||
},
|
||||
"setup_sync-in-progress": {
|
||||
"heading": "Synchronisation en cours",
|
||||
"successful": "La synchronisation a été correctement configurée. La synchronisation initiale prendra un certain temps. Une fois terminée, vous serez redirigé vers la page de connexion.",
|
||||
"outstanding-items": "Éléments de synchronisation exceptionnels :",
|
||||
"outstanding-items-default": "N/A"
|
||||
},
|
||||
"share_404": {
|
||||
"title": "Page non trouvée",
|
||||
"heading": "Page non trouvée"
|
||||
},
|
||||
"share_page": {
|
||||
"parent": "parent :",
|
||||
"clipped-from": "Cette note a été initialement extraite de {{- url}}",
|
||||
"child-notes": "Notes enfants :",
|
||||
"no-content": "Cette note n'a aucun contenu."
|
||||
},
|
||||
"weekdays": {
|
||||
"monday": "Lundi",
|
||||
"tuesday": "Mardi",
|
||||
"wednesday": "Mercredi",
|
||||
"thursday": "Jeudi",
|
||||
"friday": "Vendredi",
|
||||
"saturday": "Samedi",
|
||||
"sunday": "Dimanche"
|
||||
},
|
||||
"months": {
|
||||
"january": "Janvier",
|
||||
"february": "Février",
|
||||
"march": "Mars",
|
||||
"april": "Avril",
|
||||
"may": "Mai",
|
||||
"june": "Juin",
|
||||
"july": "Juillet",
|
||||
"august": "Août",
|
||||
"september": "Septembre",
|
||||
"october": "Octobre",
|
||||
"november": "Novembre",
|
||||
"december": "Décembre"
|
||||
},
|
||||
"special_notes": {
|
||||
"search_prefix": "Recherche :"
|
||||
},
|
||||
"test_sync": {
|
||||
"not-configured": "L'hôte du serveur de synchronisation n'est pas configuré. Veuillez d'abord configurer la synchronisation.",
|
||||
"successful": "L'établissement de liaison du serveur de synchronisation a été réussi, la synchronisation a été démarrée."
|
||||
},
|
||||
"hidden-subtree": {
|
||||
"root-title": "Notes cachées",
|
||||
"search-history-title": "Historique de recherche",
|
||||
"note-map-title": "Carte de la Note",
|
||||
"sql-console-history-title": "Historique de la console SQL",
|
||||
"shared-notes-title": "Notes partagées",
|
||||
"bulk-action-title": "Action groupée",
|
||||
"backend-log-title": "Journal Backend",
|
||||
"user-hidden-title": "Utilisateur masqué",
|
||||
"launch-bar-templates-title": "Modèles de barre de raccourcis",
|
||||
"base-abstract-launcher-title": "Raccourci Base abstraite",
|
||||
"command-launcher-title": "Raccourci Commande",
|
||||
"note-launcher-title": "Raccourci Note",
|
||||
"script-launcher-title": "Raccourci Script",
|
||||
"built-in-widget-title": "Widget intégré",
|
||||
"spacer-title": "Séparateur",
|
||||
"custom-widget-title": "Widget personnalisé",
|
||||
"launch-bar-title": "Barre de lancement",
|
||||
"available-launchers-title": "Raccourcis disponibles",
|
||||
"go-to-previous-note-title": "Aller à la note précédente",
|
||||
"go-to-next-note-title": "Aller à la note suivante",
|
||||
"new-note-title": "Nouvelle note",
|
||||
"search-notes-title": "Rechercher des notes",
|
||||
"calendar-title": "Calendrier",
|
||||
"recent-changes-title": "Modifications récentes",
|
||||
"bookmarks-title": "Signets",
|
||||
"open-today-journal-note-title": "Ouvrir la note du journal du jour",
|
||||
"quick-search-title": "Recherche rapide",
|
||||
"protected-session-title": "Session protégée",
|
||||
"sync-status-title": "État de la synchronisation",
|
||||
"settings-title": "Réglages",
|
||||
"options-title": "Options",
|
||||
"appearance-title": "Apparence",
|
||||
"shortcuts-title": "Raccourcis",
|
||||
"text-notes": "Notes de texte",
|
||||
"code-notes-title": "Notes de code",
|
||||
"images-title": "Images",
|
||||
"spellcheck-title": "Correcteur orthographique",
|
||||
"password-title": "Mot de passe",
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "Sauvegarde",
|
||||
"sync-title": "Synchronisation",
|
||||
"other": "Autre",
|
||||
"advanced-title": "Avancé",
|
||||
"visible-launchers-title": "Raccourcis visibles",
|
||||
"user-guide": "Guide de l'utilisateur",
|
||||
"jump-to-note-title": "Aller à...",
|
||||
"multi-factor-authentication-title": "MFA",
|
||||
"localization": "Langue et région",
|
||||
"inbox-title": "Boîte de réception",
|
||||
"command-palette": "Ouvrir la palette de commandes",
|
||||
"zen-mode": "Mode Zen"
|
||||
},
|
||||
"notes": {
|
||||
"new-note": "Nouvelle note",
|
||||
"duplicate-note-suffix": "(dup)",
|
||||
"duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}"
|
||||
},
|
||||
"backend_log": {
|
||||
"log-does-not-exist": "Le fichier journal '{{ fileName }}' n'existe pas (encore).",
|
||||
"reading-log-failed": "La lecture du fichier journal d'administration '{{ fileName }}' a échoué."
|
||||
},
|
||||
"content_renderer": {
|
||||
"note-cannot-be-displayed": "Ce type de note ne peut pas être affiché."
|
||||
},
|
||||
"pdf": {
|
||||
"export_filter": "Document PDF (*.pdf)",
|
||||
"unable-to-export-message": "La note actuelle n'a pas pu être exportée en format PDF.",
|
||||
"unable-to-export-title": "Impossible d'exporter au format PDF",
|
||||
"unable-to-save-message": "Le fichier sélectionné n'a pas pu être écrit. Réessayez ou sélectionnez une autre destination.",
|
||||
"unable-to-print": "Impossible d'imprimer la note"
|
||||
},
|
||||
"tray": {
|
||||
"tooltip": "Trilium Notes",
|
||||
"close": "Quitter Trilium",
|
||||
"recents": "Notes récentes",
|
||||
"bookmarks": "Signets",
|
||||
"today": "Ouvrir la note du journal du jour",
|
||||
"new-note": "Nouvelle note",
|
||||
"show-windows": "Afficher les fenêtres",
|
||||
"open_new_window": "Ouvrir une nouvelle fenêtre"
|
||||
},
|
||||
"migration": {
|
||||
"old_version": "La migration directe à partir de votre version actuelle n'est pas prise en charge. Veuillez d'abord mettre à jour vers la version v0.60.4, puis vers cette nouvelle version.",
|
||||
"error_message": "Erreur lors de la migration vers la version {{version}}: {{stack}}",
|
||||
"wrong_db_version": "La version de la base de données ({{version}}) est plus récente que ce que l'application supporte actuellement ({{targetVersion}}), ce qui signifie qu'elle a été créée par une version plus récente et incompatible de Trilium. Mettez à jour vers la dernière version de Trilium pour résoudre ce problème."
|
||||
},
|
||||
"modals": {
|
||||
"error_title": "Erreur"
|
||||
},
|
||||
"keyboard_action_names": {
|
||||
"command-palette": "Palette de commandes",
|
||||
"quick-search": "Recherche rapide",
|
||||
"back-in-note-history": "Revenir dans l’historique des notes",
|
||||
"forward-in-note-history": "Suivant dans l’historique des notes",
|
||||
"jump-to-note": "Aller à…",
|
||||
"scroll-to-active-note": "Faire défiler jusqu’à la note active",
|
||||
"search-in-subtree": "Rechercher dans la sous-arborescence",
|
||||
"expand-subtree": "Développer la sous-arborescence",
|
||||
"collapse-tree": "Réduire l’arborescence",
|
||||
"collapse-subtree": "Réduire la sous-arborescence",
|
||||
"sort-child-notes": "Trier les notes enfants",
|
||||
"create-note-after": "Créer une note après",
|
||||
"create-note-into": "Créer une note dans",
|
||||
"create-note-into-inbox": "Créer une note dans Inbox",
|
||||
"delete-notes": "Supprimer les notes",
|
||||
"move-note-up": "Remonter la note",
|
||||
"move-note-down": "Descendre la note",
|
||||
"move-note-up-in-hierarchy": "Monter la note dans la hiérarchie",
|
||||
"move-note-down-in-hierarchy": "Descendre la note dans la hiérarchie",
|
||||
"edit-note-title": "Modifier le titre de la note",
|
||||
"edit-branch-prefix": "Modifier le préfixe de la branche",
|
||||
"clone-notes-to": "Cloner les notes vers",
|
||||
"move-notes-to": "Déplacer les notes vers",
|
||||
"copy-notes-to-clipboard": "Copier les notes dans le presse-papiers",
|
||||
"paste-notes-from-clipboard": "Coller les notes depuis le presse-papiers",
|
||||
"cut-notes-to-clipboard": "Couper les notes vers le presse-papier",
|
||||
"select-all-notes-in-parent": "Selectionner toutes les notes dans le parent",
|
||||
"add-note-above-to-selection": "Ajouter la note au-dessus à la selection",
|
||||
"add-note-below-to-selection": "Ajouter la note dessous à la selection",
|
||||
"duplicate-subtree": "Dupliquer la sous-arborescence",
|
||||
"open-new-tab": "Ouvrir un nouvel onglet",
|
||||
"close-active-tab": "Fermer l'onglet actif",
|
||||
"reopen-last-tab": "Réouvrir le dernier onglet",
|
||||
"activate-next-tab": "Activer l'onglet suivant",
|
||||
"activate-previous-tab": "Activer l'onglet précédent",
|
||||
"open-new-window": "Ouvrir une nouvelle fenêtre",
|
||||
"toggle-system-tray-icon": "Activer/Désactiver l'icone de la barre d'état",
|
||||
"toggle-zen-mode": "Activer/Désactiver le mode Zen",
|
||||
"switch-to-first-tab": "Aller au premier onglet",
|
||||
"switch-to-second-tab": "Aller au second onglet",
|
||||
"switch-to-third-tab": "Aller au troisième onglet",
|
||||
"switch-to-fourth-tab": "Aller au quatrième onglet",
|
||||
"switch-to-fifth-tab": "Aller au cinquième onglet",
|
||||
"switch-to-sixth-tab": "Aller au sixième onglet",
|
||||
"switch-to-seventh-tab": "Aller au septième onglet",
|
||||
"switch-to-eighth-tab": "Aller au huitième onglet",
|
||||
"switch-to-ninth-tab": "Aller au neuvième onglet",
|
||||
"switch-to-last-tab": "Aller au dernier onglet",
|
||||
"show-note-source": "Afficher la source de la note",
|
||||
"show-options": "Afficher les options",
|
||||
"show-revisions": "Afficher les révisions",
|
||||
"show-recent-changes": "Afficher les changements récents",
|
||||
"show-sql-console": "Afficher la console SQL",
|
||||
"show-backend-log": "Afficher le journal du backend",
|
||||
"show-help": "Afficher l'aide",
|
||||
"show-cheatsheet": "Afficher la fiche de triche",
|
||||
"add-link-to-text": "Ajouter un lien au texte",
|
||||
"follow-link-under-cursor": "Suivre le lien en dessous du curseur",
|
||||
"insert-date-and-time-to-text": "Insérer la date et l'heure dans le texte",
|
||||
"paste-markdown-into-text": "Coller du Markdown dans le texte",
|
||||
"cut-into-note": "Couper dans une note",
|
||||
"add-include-note-to-text": "Ajouter une note inclusion au texte",
|
||||
"edit-read-only-note": "Modifier une note en lecture seule",
|
||||
"add-new-label": "Ajouter une nouvelle étiquette",
|
||||
"add-new-relation": "Ajouter une nouvelle relation",
|
||||
"toggle-ribbon-tab-classic-editor": "Basculer l'onglet Mise en forme de l'éditeur avec la barre d'outils fixe",
|
||||
"toggle-ribbon-tab-basic-properties": "Afficher/masquer les Propriétés de base de la note",
|
||||
"toggle-ribbon-tab-book-properties": "Afficher/masquer les Propriétés du Livre",
|
||||
"toggle-ribbon-tab-file-properties": "Afficher/masquer les Propriétés du fichier",
|
||||
"toggle-ribbon-tab-image-properties": "Afficher/masquer les Propriétés de l'image",
|
||||
"toggle-ribbon-tab-owned-attributes": "Afficher/masquer les Attributs propres",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Afficher/masquer les Attributs hérités",
|
||||
"toggle-right-pane": "Afficher le panneau de droite",
|
||||
"print-active-note": "Imprimer la note active",
|
||||
"export-active-note-as-pdf": "Exporter la note active en PDF",
|
||||
"open-note-externally": "Ouvrir la note à l'extérieur",
|
||||
"render-active-note": "Faire un rendu de la note active",
|
||||
"run-active-note": "Lancer la note active",
|
||||
"reload-frontend-app": "Recharger l'application Frontend",
|
||||
"open-developer-tools": "Ouvrir les outils développeur",
|
||||
"find-in-text": "Chercher un texte",
|
||||
"toggle-left-pane": "Afficher le panneau de gauche",
|
||||
"toggle-full-screen": "Passer en mode plein écran",
|
||||
"zoom-out": "Dézoomer",
|
||||
"zoom-in": "Zoomer",
|
||||
"reset-zoom-level": "Réinitilaliser le zoom",
|
||||
"copy-without-formatting": "Copier sans mise en forme",
|
||||
"force-save-revision": "Forcer la sauvegarde de la révision",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Basculer les attributs promus de l'onglet du ruban",
|
||||
"toggle-ribbon-tab-note-map": "Basculer l'onglet du ruban Note Map",
|
||||
"toggle-ribbon-tab-note-info": "Basculer l'onglet du ruban Note Info",
|
||||
"toggle-ribbon-tab-note-paths": "Basculer les chemins de notes de l'onglet du ruban",
|
||||
"toggle-ribbon-tab-similar-notes": "Basculer l'onglet du ruban Notes similaires",
|
||||
"toggle-note-hoisting": "Activer la focalisation sur la note",
|
||||
"unhoist-note": "Désactiver la focalisation sur la note"
|
||||
},
|
||||
"sql_init": {
|
||||
"db_not_initialized_desktop": "Base de données non initialisée, merci de suivre les instructions à l'écran.",
|
||||
"db_not_initialized_server": "Base de données non initialisée, veuillez visitez - http://[your-server-host]:{{port}} pour consulter les instructions d'initialisation de Trilium."
|
||||
},
|
||||
"desktop": {
|
||||
"instance_already_running": "Une instance est déjà en cours d'execution, ouverture de cette instance à la place."
|
||||
},
|
||||
"weekdayNumber": "Semaine {weekNumber}",
|
||||
"quarterNumber": "Trimestre {quarterNumber}",
|
||||
"share_theme": {
|
||||
"site-theme": "Thème du site",
|
||||
"search_placeholder": "Recherche...",
|
||||
"image_alt": "Image de l'article",
|
||||
"last-updated": "Dernière mise à jour le {{- date}}",
|
||||
"subpages": "Sous-pages:",
|
||||
"on-this-page": "Sur cette page",
|
||||
"expand": "Développer"
|
||||
},
|
||||
"hidden_subtree_templates": {
|
||||
"text-snippet": "Extrait de texte",
|
||||
"description": "Description",
|
||||
"list-view": "Vue en liste",
|
||||
"grid-view": "Vue en grille",
|
||||
"calendar": "Calendrier",
|
||||
"table": "Tableau",
|
||||
"geo-map": "Carte géographique",
|
||||
"start-date": "Date de début",
|
||||
"end-date": "Date de fin",
|
||||
"start-time": "Heure de début",
|
||||
"end-time": "Heure de fin",
|
||||
"geolocation": "Géolocalisation",
|
||||
"built-in-templates": "Modèles intégrés",
|
||||
"board": "Tableau de bord",
|
||||
"status": "État",
|
||||
"board_note_first": "Première note",
|
||||
"board_note_second": "Deuxième note",
|
||||
"board_note_third": "Troisième note",
|
||||
"board_status_todo": "A faire",
|
||||
"board_status_progress": "En cours",
|
||||
"board_status_done": "Terminé",
|
||||
"presentation": "Présentation",
|
||||
"presentation_slide": "Diapositive de présentation",
|
||||
"presentation_slide_first": "Première diapositive",
|
||||
"presentation_slide_second": "Deuxième diapositive",
|
||||
"background": "Arrière-plan"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -337,7 +337,6 @@
|
||||
"protected-session-title": "Seisiún faoi Chosaint",
|
||||
"sync-status-title": "Stádas Sioncrónaithe",
|
||||
"settings-title": "Socruithe",
|
||||
"llm-chat-title": "Comhrá le Nótaí",
|
||||
"options-title": "Roghanna",
|
||||
"appearance-title": "Dealramh",
|
||||
"shortcuts-title": "Aicearraí",
|
||||
@@ -350,7 +349,6 @@
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "Cúltaca",
|
||||
"sync-title": "Sioncrónaigh",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"other": "Eile",
|
||||
"advanced-title": "Ardleibhéil",
|
||||
"visible-launchers-title": "Lainseálaithe Infheicthe",
|
||||
|
||||
@@ -109,7 +109,6 @@
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "Backup",
|
||||
"sync-title": "Sincronizza",
|
||||
"ai-llm-title": "IA/LLM",
|
||||
"other": "Altro",
|
||||
"advanced-title": "Avanzato",
|
||||
"user-guide": "Guida utente",
|
||||
@@ -145,7 +144,6 @@
|
||||
"protected-session-title": "Sessione Protetta",
|
||||
"sync-status-title": "Stato della sincronizzazione",
|
||||
"settings-title": "Impostazioni",
|
||||
"llm-chat-title": "Parla con Notes",
|
||||
"note-launcher-title": "Scorciatoie delle note",
|
||||
"script-launcher-title": "Scorciatoie degli script",
|
||||
"command-palette": "Apri tavolozza comandi",
|
||||
|
||||
@@ -302,7 +302,6 @@
|
||||
"spellcheck-title": "スペルチェック",
|
||||
"password-title": "パスワード",
|
||||
"backup-title": "バックアップ",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"other": "その他",
|
||||
"advanced-title": "高度",
|
||||
"user-guide": "ユーザーガイド",
|
||||
@@ -336,7 +335,6 @@
|
||||
"protected-session-title": "保護されたセッション",
|
||||
"sync-status-title": "同期状態",
|
||||
"settings-title": "設定",
|
||||
"llm-chat-title": "ノートとチャット",
|
||||
"options-title": "設定",
|
||||
"multi-factor-authentication-title": "多要素認証",
|
||||
"etapi-title": "ETAPI",
|
||||
|
||||
@@ -110,7 +110,6 @@
|
||||
"protected-session-title": "보호된 세션",
|
||||
"sync-status-title": "동기화 상태",
|
||||
"settings-title": "설정",
|
||||
"llm-chat-title": "기록과 대화하기",
|
||||
"options-title": "옵션",
|
||||
"appearance-title": "모양",
|
||||
"shortcuts-title": "바로가기",
|
||||
@@ -123,7 +122,6 @@
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "백업",
|
||||
"sync-title": "동기화",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"other": "기타",
|
||||
"advanced-title": "고급"
|
||||
}
|
||||
|
||||
@@ -335,7 +335,6 @@
|
||||
"protected-session-title": "Sessão Protegida",
|
||||
"sync-status-title": "Estado de Sincronização",
|
||||
"settings-title": "Configurações",
|
||||
"llm-chat-title": "Conversar com as Notas",
|
||||
"options-title": "Opções",
|
||||
"appearance-title": "Aparência",
|
||||
"shortcuts-title": "Atalhos",
|
||||
@@ -348,7 +347,6 @@
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "Backup",
|
||||
"sync-title": "Sincronizar",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"other": "Outros",
|
||||
"advanced-title": "Avançado",
|
||||
"visible-launchers-title": "Atalhos Visíveis",
|
||||
|
||||
@@ -329,7 +329,6 @@
|
||||
"protected-session-title": "Sessão Protegida",
|
||||
"sync-status-title": "Status de Sincronização",
|
||||
"settings-title": "Configurações",
|
||||
"llm-chat-title": "Conversar com as Notas",
|
||||
"options-title": "Opções",
|
||||
"appearance-title": "Aparência",
|
||||
"shortcuts-title": "Atalhos",
|
||||
@@ -342,7 +341,6 @@
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "Backup",
|
||||
"sync-title": "Sincronizar",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"other": "Outros",
|
||||
"advanced-title": "Avançado",
|
||||
"user-guide": "Guia do Usuário",
|
||||
|
||||
@@ -251,9 +251,7 @@
|
||||
"visible-launchers-title": "Lansatoare vizibile",
|
||||
"user-guide": "Ghidul de utilizare",
|
||||
"jump-to-note-title": "Sari la...",
|
||||
"llm-chat-title": "Întreabă Notes",
|
||||
"multi-factor-authentication-title": "Autentificare multi-factor",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"localization": "Limbă și regiune",
|
||||
"inbox-title": "Inbox",
|
||||
"command-palette": "Deschide paleta de comenzi",
|
||||
|
||||
@@ -121,7 +121,6 @@
|
||||
"multi-factor-authentication-title": "MFA",
|
||||
"backup-title": "Резервное копирование",
|
||||
"sync-title": "Синхронизация",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"other": "Прочее",
|
||||
"advanced-title": "Расширенные настройки",
|
||||
"inbox-title": "Входящие",
|
||||
@@ -156,7 +155,6 @@
|
||||
"go-to-previous-note-title": "К предыдущей заметке",
|
||||
"go-to-next-note-title": "К следующей заметке",
|
||||
"open-today-journal-note-title": "Открыть сегодняшнюю заметку в журнале",
|
||||
"llm-chat-title": "ИИ чат с заметками",
|
||||
"zen-mode": "Режим \"Дзен\"",
|
||||
"command-palette": "Открыть панель команд"
|
||||
},
|
||||
|
||||
@@ -335,7 +335,6 @@
|
||||
"protected-session-title": "受保護的作業階段",
|
||||
"sync-status-title": "同步狀態",
|
||||
"settings-title": "設定",
|
||||
"llm-chat-title": "與筆記聊天",
|
||||
"options-title": "選項",
|
||||
"appearance-title": "外觀",
|
||||
"shortcuts-title": "快捷鍵",
|
||||
@@ -348,7 +347,6 @@
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "備份",
|
||||
"sync-title": "同步",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"other": "其他",
|
||||
"advanced-title": "進階",
|
||||
"visible-launchers-title": "可見啟動器",
|
||||
|
||||
@@ -334,7 +334,6 @@
|
||||
"protected-session-title": "Захищений Сеанс",
|
||||
"sync-status-title": "Статус синхронізації",
|
||||
"settings-title": "Налаштування",
|
||||
"llm-chat-title": "Чат з Нотатками",
|
||||
"options-title": "Параметри",
|
||||
"appearance-title": "Зовнішній вигляд",
|
||||
"shortcuts-title": "Комбінації клавіші",
|
||||
@@ -347,7 +346,6 @@
|
||||
"etapi-title": "ETAPI",
|
||||
"backup-title": "Резервне копіювання",
|
||||
"sync-title": "Синхронізація",
|
||||
"ai-llm-title": "AI/LLM",
|
||||
"other": "Інше",
|
||||
"advanced-title": "Розширені",
|
||||
"visible-launchers-title": "Видимі Лаунчери",
|
||||
|
||||
21
apps/server/src/migrations/0234__migrate_ai_chat_to_code.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
import becca from "../becca/becca";
|
||||
import becca_loader from "../becca/becca_loader";
|
||||
import cls from "../services/cls.js";
|
||||
|
||||
export default () => {
|
||||
cls.init(() => {
|
||||
becca_loader.load();
|
||||
|
||||
for (const note of Object.values(becca.notes)) {
|
||||
if (note.type as string !== "aiChat") {
|
||||
continue;
|
||||
}
|
||||
|
||||
console.log(`Migrating note '${note.noteId}' from aiChat to code type...`);
|
||||
|
||||
note.type = "code";
|
||||
note.mime = "application/json";
|
||||
note.save();
|
||||
}
|
||||
});
|
||||
};
|
||||
@@ -6,6 +6,11 @@
|
||||
|
||||
// Migrations should be kept in descending order, so the latest migration is first.
|
||||
const MIGRATIONS: (SqlMigration | JsMigration)[] = [
|
||||
// Migrate aiChat notes to code notes since LLM integration has been removed
|
||||
{
|
||||
version: 234,
|
||||
module: async () => import("./0234__migrate_ai_chat_to_code.js")
|
||||
},
|
||||
// Migrate geo map to collection
|
||||
{
|
||||
version: 233,
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
import options from "../../services/options.js";
|
||||
import log from "../../services/log.js";
|
||||
import type { Request, Response } from "express";
|
||||
import { PROVIDER_CONSTANTS } from '../../services/llm/constants/provider_constants.js';
|
||||
import Anthropic from '@anthropic-ai/sdk';
|
||||
|
||||
// Interface for Anthropic model entries
|
||||
interface AnthropicModel {
|
||||
id: string;
|
||||
name: string;
|
||||
type: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
* /api/anthropic/models:
|
||||
* post:
|
||||
* summary: List available models from Anthropic
|
||||
* operationId: anthropic-list-models
|
||||
* requestBody:
|
||||
* required: false
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* properties:
|
||||
* baseUrl:
|
||||
* type: string
|
||||
* description: Optional custom Anthropic API base URL
|
||||
* responses:
|
||||
* '200':
|
||||
* description: List of available Anthropic models
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* properties:
|
||||
* success:
|
||||
* type: boolean
|
||||
* chatModels:
|
||||
* type: array
|
||||
* items:
|
||||
* type: object
|
||||
* properties:
|
||||
* id:
|
||||
* type: string
|
||||
* name:
|
||||
* type: string
|
||||
* type:
|
||||
* type: string
|
||||
* '500':
|
||||
* description: Error listing models
|
||||
* security:
|
||||
* - session: []
|
||||
* tags: ["llm"]
|
||||
*/
|
||||
async function listModels(req: Request, res: Response) {
|
||||
try {
|
||||
const { baseUrl } = req.body;
|
||||
|
||||
// Use provided base URL or default from options
|
||||
const anthropicBaseUrl = baseUrl ||
|
||||
await options.getOption('anthropicBaseUrl') ||
|
||||
PROVIDER_CONSTANTS.ANTHROPIC.BASE_URL;
|
||||
|
||||
const apiKey = await options.getOption('anthropicApiKey');
|
||||
|
||||
if (!apiKey) {
|
||||
throw new Error('Anthropic API key is not configured');
|
||||
}
|
||||
|
||||
log.info(`Using predefined Anthropic models list (avoiding direct API call)`);
|
||||
|
||||
// Instead of using the SDK's built-in models listing which might not work,
|
||||
// directly use the predefined available models
|
||||
const chatModels = PROVIDER_CONSTANTS.ANTHROPIC.AVAILABLE_MODELS.map(model => ({
|
||||
id: model.id,
|
||||
name: model.name,
|
||||
type: 'chat'
|
||||
}));
|
||||
|
||||
// Return the models list
|
||||
return {
|
||||
success: true,
|
||||
chatModels
|
||||
};
|
||||
} catch (error: any) {
|
||||
log.error(`Error listing Anthropic models: ${error.message || 'Unknown error'}`);
|
||||
|
||||
// Properly throw the error to be handled by the global error handler
|
||||
throw new Error(`Failed to list Anthropic models: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
listModels
|
||||
};
|
||||