v6.1.0 renamed parseOfficeAsync to OfficeParser.parseOffice (static
method) and returns an AST object with toText() instead of a plain
string.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v6.1.0 added native ESM with Node16 resolution and a strict exports
field, breaking deep subpath imports like
officeparser/dist/parsers/ExcelParser.js. Switch to the main package
entry and use parseOfficeAsync(), which accepts a Buffer and
auto-detects the format via magic bytes.
Co-authored-by: Elian Doran <eliandoran@users.noreply.github.com>
The contents, pull-requests, and issues permissions were set to read, preventing Claude from pushing commits and commenting on PRs/issues.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The pull-requests permission was set to read, preventing Claude from posting review comments on PRs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Resolved conflicts:
- search_result.ts: Keep optimized index-based token iteration
- search.ts: Merge OCR text representation support with perf optimizations
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Extract duplicated cleanup logic into shared finalizeStream() function
- Add else branch to re-throw non-AbortError exceptions instead of swallowing them
- Move PROTECTED_SYSTEM_NOTES to helpers.ts for shared use
- move_note: check against full system notes set, add protected parent check
- clone_note: add source note protection + protected parent checks
- delete_note: fix description to say 'soft delete' (recoverable)
The calendar event has a light yellow background with light yellow text in dark theme, making it nearly unreadable.
The root cause is a CSS load order issue. The :root defaults in index.css:1-10 are loaded after the dark theme's :root overrides (since component CSS loads after global CSS in Vite), so the defaults (95% lightness, 80% saturation) stomp over the dark theme values (20% lightness, 25% saturation). The background stays light, but --custom-color correctly gets the dark-adjusted (light) text color → light-on-light = bad contrast.
The fix: remove the :root block and use var() fallbacks instead, so there's no :root competition.
Allow users to stop an in-progress LLM generation by aborting the
SSE connection. The send button transforms into a red stop button
during streaming.
- AbortController passed to fetch() signal for stream cancellation
- On abort, partial content is finalized and saved as a message
- Stop button replaces send button during streaming with danger color
- Button is always clickable during streaming (not disabled)
Add four new LLM tools for note management:
- rename_note: Change the title of an existing note
- delete_note: Delete a note with system note protection
- move_note: Move a note to a new parent using branch service
- clone_note: Clone a note to an additional parent
All mutation tools are marked with mutates: true for the tool
approval system. Protected and system notes are guarded against
modification.
OCRContentExpression now takes all tokens as an array (like NoteContentFulltextExp), iterates over the input note set from becca, and checks text representations in-memory — zero SQL queries.
parse.ts creates a single OCRContentExpression(tokens) instead of N separate instances.
The LIMIT 50 and the N+1 blob→note/attachment queries are gone entirely.
- Remove deprecated `locale` option and LOCALE_MAPPINGS constant from MindMap.tsx
- Add `buildMindElixirLangPack()` function using i18next translations for contextMenu.locale
- Add mind-map translation keys to all 37 locale translation files
- Languages with specific translations: de, es, fr, it, ja, pt, pt_br, ru, ro, cn, tw, fi, ko, nl, nb-NO, sv
- Other languages fall back to English via i18next
Agent-Logs-Url: https://github.com/TriliumNext/Trilium/sessions/f2cb95ee-9a97-4618-ba9a-5fb7f31ab965
Co-authored-by: eliandoran <21236836+eliandoran@users.noreply.github.com>
Consolidated from 12 sections to 4. Leads with the e2e results a
reviewer cares about, follows with scaling data, then lists what
changed and known limitations. Removed redundant tables and
internal-only details.
Adds end-to-end full search (fastSearch=false) comparison tables
for both fuzzy ON and OFF, plus long queries and realistic typo
recovery benchmarks. Full search multi-token shows 45-65% improvement.
All numbers re-measured on the same machine/session after the scoring,
highlighting, and tree walk optimizations. Multi-token autocomplete
now shows 50-70% improvement over main.
The function has multiple callers (not just smartMatch) so it must
normalize inputs itself. Removing toLowerCase broke fuzzy matching
for the two-phase search path.
FTS5 query was 32x faster in isolation, but the content scan is only
1-7% of total search time. The JS pipeline (scoring, snippets,
highlighting, tree walk) dominates. The in-memory optimizations in
this PR provide the real gains.
Removes: migration, fts_index service, event wiring, UI option,
integration test. Keeps all in-memory performance optimizations.
- Remove redundant toLowerCase() before normalizeSearchText() in
search_result.ts (normalizeSearchText already lowercases)
- Pre-normalize tokens once in addScoreForStrings instead of per-chunk
- Skip edit distance computation entirely when fuzzy matching is
disabled
- Move removeDiacritic() outside the regex while-loop in highlighting
- Cache normalized parent titles per search execution in
note_flat_text.ts
- Use Set for token lookup in searchPathTowardsRoot (O(1) vs O(n))
- Remove redundant toLowerCase in fuzzyMatchWordWithResult (inputs
from smartMatch are already normalized)
Adds real SQLite benchmarks showing FTS5 is 15-33x faster for the
raw content query, though end-to-end improvement is masked by JS
pipeline overhead (scoring, snippets, path walking).
For operators =, !=, and *=*, the search now tries the FTS5 index first
via searchViaFts(). If FTS is unavailable or fails, it falls back to the
original sequential scan. The flat text attribute search is extracted
into its own searchFlatTextAttributes() method and runs after both
paths.
The commit f44b47ec added a hasTabBeenActive guard in NoteDetail that defers rendering until the tab has been active at least once. It initializes via noteContext?.isActive() and then listens for activeNoteChanged events.
The popup editor creates its own NoteContext("_popup-editor") which is never the activeNtxId in the tab manager — isActive() always returns false, and activeNoteChanged never fires for it. So hasTabBeenActive stays false forever, and the if (!type || !hasTabBeenActive) return guard at NoteDetail.tsx:64 prevents the note type widget from ever loading.
> **Note**: When updating this file, also update `CLAUDE.md` in the repository root to keep both AI coding assistants in sync.
## Project Overview
Trilium Notes is a hierarchical note-taking application with advanced features like synchronization, scripting, and rich text editing. Built as a TypeScript monorepo using pnpm, it implements a three-layer caching architecture (Becca/Froca/Shaca) with a widget-based UI system and supports extensive user scripting capabilities.
@@ -115,6 +117,24 @@ class MyNoteWidget extends NoteContextAwareWidget {
**Important**: Widgets use jQuery (`this.$widget`) for DOM manipulation. Don't mix React patterns here.
### Reusable Preact Components
Common UI components are available in `apps/client/src/widgets/react/` — **always** reuse these instead of writing raw HTML elements or custom implementations:
-`NoItems` - Empty state placeholder with icon and message (use for "no results", "too many items", error states)
-`ActionButton` - Consistent button styling with icon support
-`FormTextBox` - Text input with validation and controlled input handling; `FormTextBoxWithUnit` for inputs with a unit suffix (e.g. "mm", "px")
-`FormSelect` - Dropdown/combobox taking an object array as data
**Do not use Bootstrap utility classes** (e.g. `form-control-sm`, `form-select-sm`, `input-group`) on these components — they manage their own styling internally. If you need to adjust sizing or layout, use props provided by the component or CSS custom properties, not Bootstrap overrides.
#### Component Styling
- **Avoid inline styles** — do not use the `style` attribute/prop on JSX elements unless absolutely necessary (e.g. a truly dynamic, computed value that cannot be expressed in CSS). Static layout, sizing, spacing, and visual properties must go in CSS.
- **Per-component CSS files**: each component should have a matching `.css` file (e.g. `my_dialog.tsx` → `my_dialog.css`), imported at the top of the component file.
- **CSS nesting for scoping**: since CSS modules are not available, scope styles using a root class and native CSS nesting. For example, a dialog with `className="my-dialog"` should have its styles nested under `.modal.my-dialog { … }`.
- **Reuse existing components** instead of building custom markup — prefer `FormTextBox`, `FormTextBoxWithUnit`, `FormSelect`, `Slider`, `Button`, etc. over hand-rolled `<input>`, `<select>`, or `<button>` elements.
## Development Workflow
### Running & Testing
@@ -186,6 +206,14 @@ When adding query parameters to ETAPI endpoints (`apps/server/src/etapi/`), main
**Auth note**: ETAPI uses basic auth with tokens. Internal API endpoints trust the frontend.
### Adding New LLM Tools
Tools are defined using `defineTools()` in `apps/server/src/services/llm/tools/` and automatically registered for both the LLM chat and MCP server.
1. Add the tool definition in the appropriate module (`note_tools.ts`, `attribute_tools.ts`, `hierarchy_tools.ts`) or create a new module
2. Each tool needs: `description`, `inputSchema` (Zod), `execute` function, and optionally `mutates: true` for write operations or `needsContext: true` for tools that need the current note context
3. If creating a new module, wrap tools in `defineTools({...})` and add the registry to `allToolRegistries` in `tools/index.ts`
4. Add a client-side friendly name in `apps/client/src/translations/en/translation.json` under `llm.tools.<tool_name>` — use **imperative tense** (e.g. "Search notes", "Create note", "Get attributes"), not present continuous
### Database Migrations
- Add scripts in `apps/server/src/migrations/YYMMDD_HHMM__description.sql`
- Update schema in `apps/server/src/assets/db/schema.sql`
@@ -213,6 +241,12 @@ When adding query parameters to ETAPI endpoints (`apps/server/src/etapi/`), main
10.**Attribute inheritance can be complex** - When checking for labels/relations, use `note.getOwnedAttribute()` for direct attributes or `note.getAttribute()` for inherited ones. Don't assume attributes are directly on the note.
## MCP Server
- Trilium exposes an MCP (Model Context Protocol) server at `http://localhost:8080/mcp`, configured in `.mcp.json`
- The MCP server is **only available when the Trilium server is running** (`pnpm run server:start`)
- It provides tools for reading, searching, and modifying notes directly from the AI assistant
- Use it to interact with actual note data when developing or debugging note-related features
@@ -275,6 +309,12 @@ View types are configured via `#viewType` label (e.g., `#viewType=table`). Each
- Register in `packages/ckeditor5/src/plugins.ts`
- See `ckeditor5-admonition`, `ckeditor5-footnotes`, `ckeditor5-math`, `ckeditor5-mermaid` for examples
### Updating PDF.js
1. Update `pdfjs-dist` version in `packages/pdfjs-viewer/package.json`
2. Run `npx tsx scripts/update-viewer.ts` from that directory
3. Run `pnpm build` to verify success
4. Commit all changes including updated viewer files
### Database Migrations
- Add migration scripts in `apps/server/src/migrations/YYMMDD_HHMM__description.sql`
- Update schema in `apps/server/src/assets/db/schema.sql`
@@ -299,9 +339,29 @@ Trilium provides powerful user scripting capabilities:
- Translation files in `apps/client/src/translations/`
- Use translation system via `t()` function
- Automatic pluralization: Add `_other` suffix to translation keys (e.g., `item` and `item_other` for singular/plural)
- When a translated string contains **interpolated components** (e.g. links, note references) whose order may vary across languages, use `<Trans>` from `react-i18next` instead of `t()`. This lets translators reorder components freely (e.g. `"<Note/> in <Parent/>"` vs `"in <Parent/>, <Note/>"`)
- When adding a new locale, follow the step-by-step guide in `docs/Developer Guide/Developer Guide/Concepts/Internationalisation Translations/Adding a new locale.md`
#### Client vs Server Translation Usage
- **Client-side**: `import { t } from "../services/i18n"` with keys in `apps/client/src/translations/en/translation.json`
- **Server-side**: `import { t } from "i18next"` with keys in `apps/server/src/assets/translations/en/server.json`
- **Interpolation**: Use `{{variable}}` for normal interpolation; use `{{- variable}}` (with hyphen) for **unescaped** interpolation when the value contains special characters like quotes that shouldn't be HTML-escaped
### Storing User Preferences
- **Do not use `localStorage`** for user preferences — Trilium has a synced options system that persists across devices
- To add a new user preference:
1. Add the option type to `OptionDefinitions` in `packages/commons/src/lib/options_interface.ts`
2. Add a default value in `apps/server/src/services/options_init.ts` in the `defaultOptions` array
3.**Whitelist the option** in `apps/server/src/routes/api/options.ts` by adding it to `ALLOWED_OPTIONS` (required for client updates)
4. Use `useTriliumOption("optionName")` hook in React components to read/write the option
- Available hooks: `useTriliumOption` (string), `useTriliumOptionBool`, `useTriliumOptionInt`, `useTriliumOptionJson`
- See `docs/Developer Guide/Developer Guide/Concepts/Options/Creating a new option.md` for detailed documentation
## Testing Conventions
- **Write concise tests**: Group related assertions together in a single test case rather than creating many one-shot tests
- **Extract and test business logic**: When adding pure business logic (e.g., data transformations, migrations, validations), extract it as a separate function and always write unit tests for it
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
> **Note**: When updating this file, also update `.github/copilot-instructions.md` to keep both AI coding assistants in sync.
## Overview
Trilium Notes is a hierarchical note-taking application with advanced features like synchronization, scripting, and rich text editing. It's built as a TypeScript monorepo using pnpm, with multiple applications and shared packages.
@@ -66,6 +68,24 @@ Frontend uses a widget system (`apps/client/src/widgets/`):
-`RightPanelWidget` - Widgets displayed in the right panel
- Type-specific widgets in `type_widgets/` directory
#### Reusable Preact Components
Common UI components are available in `apps/client/src/widgets/react/` — **always** reuse these instead of writing raw HTML elements or custom implementations:
-`NoItems` - Empty state placeholder with icon and message (use for "no results", "too many items", error states)
-`ActionButton` - Consistent button styling with icon support
-`FormTextBox` - Text input with validation and controlled input handling; `FormTextBoxWithUnit` for inputs with a unit suffix (e.g. "mm", "px")
-`FormSelect` - Dropdown/combobox taking an object array as data
**Do not use Bootstrap utility classes** (e.g. `form-control-sm`, `form-select-sm`, `input-group`) on these components — they manage their own styling internally. If you need to adjust sizing or layout, use props provided by the component or CSS custom properties, not Bootstrap overrides.
#### Component Styling
- **Avoid inline styles** — do not use the `style` attribute/prop on JSX elements unless absolutely necessary (e.g. a truly dynamic, computed value that cannot be expressed in CSS). Static layout, sizing, spacing, and visual properties must go in CSS.
- **Per-component CSS files**: each component should have a matching `.css` file (e.g. `my_dialog.tsx` → `my_dialog.css`), imported at the top of the component file.
- **CSS nesting for scoping**: since CSS modules are not available, scope styles using a root class and native CSS nesting. For example, a dialog with `className="my-dialog"` should have its styles nested under `.modal.my-dialog { … }`.
- **Reuse existing components** instead of building custom markup — prefer `FormTextBox`, `FormTextBoxWithUnit`, `FormSelect`, `Slider`, `Button`, etc. over hand-rolled `<input>`, `<select>`, or `<button>` elements.
#### API Architecture
- **Internal API**: REST endpoints in `apps/server/src/routes/api/`
- **ETAPI**: External API for third-party integrations (`apps/server/src/etapi/`)
@@ -108,6 +128,8 @@ Trilium supports multiple note types, each with specialized widgets:
- Client tests can run in parallel
- E2E tests use Playwright for both server and desktop apps
- Build validation tests check artifact integrity
- **Write concise tests**: Group related assertions together in a single test case rather than creating many one-shot tests
- **Extract and test business logic**: When adding pure business logic (e.g., data transformations, migrations, validations), extract it as a separate function and always write unit tests for it
### Scripting System
Trilium provides powerful user scripting capabilities:
@@ -118,6 +140,21 @@ Trilium provides powerful user scripting capabilities:
### Internationalization
- Translation files in `apps/client/src/translations/`
- Supported languages: English, German, Spanish, French, Romanian, Chinese
- **Only add new translation keys to `en/translation.json`** — translations for other languages are managed via Weblate and will be contributed by the community
- Third-party components (e.g., mind-map context menu) should use i18next `t()` for their labels, with the English strings added to `en/translation.json` under a dedicated namespace (e.g., `"mind-map"`)
- When a translated string contains **interpolated components** (e.g. links, note references) whose order may vary across languages, use `<Trans>` from `react-i18next` instead of `t()`. This lets translators reorder components freely (e.g. `"<Note/> in <Parent/>"` vs `"in <Parent/>, <Note/>"`)
- When adding a new locale, follow the step-by-step guide in `docs/Developer Guide/Developer Guide/Concepts/Internationalisation Translations/Adding a new locale.md`
- **Server-side translations** (e.g. hidden subtree titles) go in `apps/server/src/assets/translations/en/server.json`, not in the client `translation.json`
#### Client vs Server Translation Usage
- **Client-side**: `import { t } from "../services/i18n"` with keys in `apps/client/src/translations/en/translation.json`
- **Server-side**: `import { t } from "i18next"` with keys in `apps/server/src/assets/translations/en/server.json`
- **Interpolation**: Use `{{variable}}` for normal interpolation; use `{{- variable}}` (with hyphen) for **unescaped** interpolation when the value contains special characters like quotes that shouldn't be HTML-escaped
- IPC communication: use `electron.ipcMain.on(channel, handler)` on server side, `electron.ipcRenderer.send(channel, data)` on client side
- Electron-only features should check `isElectron()` from `apps/client/src/services/utils.ts` (client) or `utils.isElectron` (server)
### Security Considerations
- Per-note encryption with granular protected sessions
@@ -125,6 +162,26 @@ Trilium provides powerful user scripting capabilities:
- OpenID and TOTP authentication support
- Sanitization of user-generated content
### Client-Side API Restrictions
- **Do not use `crypto.randomUUID()`** or other Web Crypto APIs that require secure contexts - Trilium can run over HTTP, not just HTTPS
- Use `randomString()` from `apps/client/src/services/utils.ts` for generating IDs instead
### Storing User Preferences
- **Do not use `localStorage`** for user preferences — Trilium has a synced options system that persists across devices
- To add a new user preference:
1. Add the option type to `OptionDefinitions` in `packages/commons/src/lib/options_interface.ts`
2. Add a default value in `apps/server/src/services/options_init.ts` in the `defaultOptions` array
3.**Whitelist the option** in `apps/server/src/routes/api/options.ts` by adding it to the `ALLOWED_OPTIONS` array — **without this, the API will reject changes with "Option 'X' is not allowed to be changed"**
4. If the option should be user-editable in the UI, add a control in the appropriate settings component (e.g., `apps/client/src/widgets/type_widgets/options/other.tsx`) and a translation key in `apps/client/src/translations/en/translation.json`
5. Use `useTriliumOption("optionName")` hook in React components to read/write the option
- Available hooks: `useTriliumOption` (string), `useTriliumOptionBool`, `useTriliumOptionInt`, `useTriliumOptionJson`
- See `docs/Developer Guide/Developer Guide/Concepts/Options/Creating a new option.md` for detailed documentation
### Shared Types Policy
- Types shared between client and server belong in `@triliumnext/commons` (`packages/commons/src/lib/`)
- Import shared types directly from `@triliumnext/commons` - do not re-export them from app-specific modules
- Keep app-specific types (e.g., `LlmProvider` for server, `StreamCallbacks` for client) in their respective apps
## Common Development Tasks
### Adding New Note Types
@@ -140,10 +197,51 @@ Trilium provides powerful user scripting capabilities:
- Create new package in `packages/` following existing plugin structure
- Register in `packages/ckeditor5/src/plugins.ts`
### Adding Hidden System Notes
The hidden subtree (`_hidden`) contains system notes with predictable IDs (prefixed with `_`). Defined in `apps/server/src/services/hidden_subtree.ts` via the `HiddenSubtreeItem` interface from `@triliumnext/commons`.
1. Add the note definition to `buildHiddenSubtreeDefinition()` in `apps/server/src/services/hidden_subtree.ts`
2. Add a translation key for the title in `apps/server/src/assets/translations/en/server.json` under `"hidden-subtree"`
3. The note is auto-created on startup by `checkHiddenSubtree()` — uses deterministic IDs so all sync cluster instances generate the same structure
4. Key properties: `id` (must start with `_`), `title`, `type`, `icon` (format: `bx-icon-name` without `bx ` prefix), `attributes`, `children`, `content`
5. Use `enforceAttributes: true` to keep attributes in sync, `enforceBranches: true` for correct placement, `enforceDeleted: true` to remove deprecated notes
6. For launcher bar entries, see `hidden_subtree_launcherbar.ts`; for templates, see `hidden_subtree_templates.ts`
### Writing to Notes from Server Services
-`note.setContent()` requires a CLS (Continuation Local Storage) context — wrap calls in `cls.init(() => { ... })` (from `apps/server/src/services/cls.ts`)
- Operations called from Express routes already have CLS context; standalone services (schedulers, Electron IPC handlers) do not
### Adding New LLM Tools
Tools are defined using `defineTools()` in `apps/server/src/services/llm/tools/` and automatically registered for both the LLM chat and MCP server.
1. Add the tool definition in the appropriate module (`note_tools.ts`, `attribute_tools.ts`, `attachment_tools.ts`, `hierarchy_tools.ts`) or create a new module
2. Each tool needs: `description`, `inputSchema` (Zod), `execute` function, and optionally `mutates: true` for write operations
3. If creating a new module, wrap tools in `defineTools({...})` and add the registry to `allToolRegistries` in `tools/index.ts`
4. Add a client-side friendly name in `apps/client/src/translations/en/translation.json` under `llm.tools.<tool_name>` — use **imperative tense** (e.g. "Search notes", "Create note", "Get attributes"), not present continuous
5. Use ETAPI (`apps/server/src/etapi/`) as inspiration for what fields to expose, but **do not import ETAPI mappers** — inline the field mappings directly in the tool so the LLM layer stays decoupled from the API layer
### Updating PDF.js
1. Update `pdfjs-dist` version in `packages/pdfjs-viewer/package.json`
2. Run `npx tsx scripts/update-viewer.ts` from that directory
3. Run `pnpm build` to verify success
4. Commit all changes including updated viewer files
### Database Migrations
- Add migration scripts in `apps/server/src/migrations/`
- Update schema in `apps/server/src/assets/db/schema.sql`
### Server-Side Static Assets
- Static assets (templates, SQL, translations, etc.) go in `apps/server/src/assets/`
- Access them at runtime via `RESOURCE_DIR` from `apps/server/src/services/resource_dir.ts` (e.g. `path.join(RESOURCE_DIR, "llm", "skills", "file.md")`)
- **Do not use `import.meta.url`/`fileURLToPath`** to resolve file paths — the server is bundled into CJS for production, so `import.meta.url` will not point to the source directory
- **Do not use `__dirname` with relative paths** from source files — after bundling, `__dirname` points to the bundle output, not the original source tree
## MCP Server
- Trilium exposes an MCP (Model Context Protocol) server at `http://localhost:8080/mcp`, configured in `.mcp.json`
- The MCP server is **only available when the Trilium server is running** (`pnpm run server:start`)
- It provides tools for reading, searching, and modifying notes directly from the AI assistant
- Use it to interact with actual note data when developing or debugging note-related features
In the (still active) 0.X phase of the project only the latest stable minor release is getting bugfixes (including security ones).
Only the latest stable minor release receives security fixes.
So e.g. if the latest stable version is 0.42.3 and the latest beta version is 0.43.0-beta, then 0.42 line will still get security fixes but older versions (like 0.41.X) won't get any fixes.
For example, if the latest stable version is 0.92.3 and the latest beta is 0.93.0-beta, then only the 0.92.x line will receive security patches. Older versions (like 0.91.x) will not receive fixes.
Description above is a general rule and may be altered on casebycase basis.
This policy may be altered on a case-by-case basis for critical vulnerabilities.
## Reporting a Vulnerability
* For low severity vulnerabilities, they can be reported as GitHub issues.
* For severe vulnerabilities, please report it using [GitHub Security Advisories](https://github.com/TriliumNext/Trilium/security/advisories).
**Please report all security vulnerabilities through [GitHub Security Advisories](https://github.com/TriliumNext/Notes/security/advisories/new).**
We do not accept security reports via email, public issues, or other channels. GitHub Security Advisories allows us to:
- Discuss and triage vulnerabilities privately
- Coordinate fixes before public disclosure
- Credit reporters appropriately
- Publish advisories with CVE identifiers
### What to Include
When reporting, please provide:
- A clear description of the vulnerability
- Steps to reproduce or proof-of-concept
- Affected versions (if known)
- Potential impact assessment
- Any suggested mitigations or fixes
### Response Timeline
- **Initial response**: Within 7 days
- **Triage decision**: Within 14 days
- **Fix timeline**: Depends on severity and complexity
## Scope
### In Scope
- Remote code execution
- Authentication/authorization bypass
- Cross-site scripting (XSS) that affects other users
- SQL injection
- Path traversal
- Sensitive data exposure
- Privilege escalation
### Out of Scope (Won't Fix)
The following are considered out of scope or accepted risks:
#### Self-XSS / Self-Injection
Trilium is a personal knowledge base where users have full control over their own data. Users can intentionally create notes containing scripts, HTML, or other executable content. This is by design - Trilium's scripting system allows users to extend functionality with custom JavaScript.
Vulnerabilities that require a user to inject malicious content into their own notes and then view it themselves are not considered security issues.
#### Electron Architecture (nodeIntegration)
Trilium's desktop application runs with `nodeIntegration: true` to enable its powerful scripting features. This is an intentional design decision, similar to VS Code extensions having full system access. We mitigate risks by:
- Sanitizing content at input boundaries
- Fixing specific XSS vectors as they're discovered
- Using Electron fuses to prevent external abuse
#### Authenticated User Actions
Actions that require valid authentication and only affect the authenticated user's own data are generally not vulnerabilities.
#### Denial of Service via Resource Exhaustion
Creating extremely large notes or performing many operations is expected user behavior in a note-taking application.
#### Missing Security Headers on Non-Sensitive Endpoints
We implement security headers where they provide meaningful protection, but may omit them on endpoints where they provide no practical benefit.
## Coordinated Disclosure
We follow a coordinated disclosure process:
1.**Report received** - We acknowledge receipt and begin triage
2.**Fix developed** - We develop and test a fix privately
3.**Release prepared** - Security release is prepared with vague changelog
4.**Users notified** - Release is published, users encouraged to upgrade
5.**Advisory published** - After reasonable upgrade window (typically 2-4 weeks), full advisory is published
We appreciate reporters allowing us time to fix issues before public disclosure. We aim to credit all reporters in published advisories unless they prefer to remain anonymous.
## Security Updates
Security fixes are released as patch versions (e.g., 0.92.1 → 0.92.2) to minimize upgrade friction. We recommend all users keep their installations up to date.
Subscribe to GitHub releases or watch the repository to receive notifications of new releases.
@@ -19,12 +19,23 @@ import Component from "./component.js";
exportinterfaceSetNoteOpts{
triggerSwitchEvent?: unknown;
viewScope?: ViewScope;
/** If true, skip closing the currently active dialog. Used when opening a note into a stackable popup (e.g. quick-edit) that must not dismiss the dialog it was launched from. */
* Method that must be run for widget scripts that run on Preact, using JSX. The method just returns the same definition, reserved for future typechecking and perhaps validation purposes.
* Identifies all the code blocks (as `pre code`) under the specified hierarchy and uses the highlight.js library to obtain the highlighted text which is then applied on to the code blocks.
* Additionally, adds a "Copy to clipboard" button.
@@ -33,6 +54,14 @@ export async function formatCodeBlocks($container: JQuery<HTMLElement>) {
"print_page_size":"导出为 PDF 时,更改页面大小。支持的值:<code>A0</code>、<code>A1</code>、<code>A2</code>、<code>A3</code>、<code>A4</code>、<code>A5</code>、<code>A6</code>、<code>Legal</code>、<code>Letter</code>、<code>Tabloid</code>、<code>Ledger</code>。",
"color_type":"颜色"
"color_type":"颜色",
"textarea":"多行文本",
"print_scale":"导出为 PDF 时,更改渲染内容的比例。取值范围从 0.1 (10%) 到 2 (200%),默认值为 1 (100%)。",
"print_margins":"导出为 PDF 时,设置页面边距。可以使用 <code>default</code>、<code>none</code>、<code>minimum</code> 或以毫米为单位的自定义值,例如 <code>top,right,bottom,left</code>。"
"lead-dev":"Elian Doran began mit der Entwicklung von TrilliumNext im Jahr 2024, nachdem Zadam, der orginale Erfinder, von dem Projekt zurücktrat. Später übergab Zadam das orginale Projekt an das TrilliumNext Team, damit beide Projekte zu eins verschmelzen konnten.",
"original-dev":"Am 25. Dezember 2017 veröffentlichte Zadam die erste Betaversion von Trilium - anders als die Blume, geschrieben mit einem \"l\". Da er unzufrieden mit dem aktuellen Stand von Notizprogrammen war, entschied er sich, selbst eine hierachie-basierte, soveräne Wissensdatenbank aufzubauen, welche über 22.000 Github Sterne bekan. Jedoch musste er das Projekt durch persönliche Gründe in den Wartungsmodus versetzen."
},
"contributor_full_list":"Die gesamte Community anschauen",
"github_tooltip":"Fehler melden, Features vorschlagen oder auf Github mitwirken",
"license_tooltip":"Lizenz ansehen",
"donate":"Spenden",
"donate_tooltip":"Spende, um Trillium zu unterstützen"
},
"toast":{
"critical-error":{
@@ -41,7 +51,9 @@
"link_title_mirrors":"Der Linktitel spiegelt den aktuellen Titel der Notiz wider",
"link_title_arbitrary":"Der Linktitel kann beliebig geändert werden",
"link_title":"Linktitel",
"button_add_link":"Link hinzufügen"
"button_add_link":"Link hinzufügen",
"anchor":"Anker (optional)",
"anchor_none":"Link zu Notiz"
},
"branch_prefix":{
"edit_branch_prefix":"Zweigpräfix bearbeiten",
@@ -88,17 +100,23 @@
"also_delete_note":"Auch die Notiz löschen"
},
"delete_notes":{
"delete_notes_preview":"Vorschau der Notizen löschen",
"close":"Schließen",
"delete_all_clones_description":"auch alle Klone löschen (kann bei letzte Änderungen rückgängig gemacht werden)",
"erase_notes_description":"Beim normalen (vorläufigen) Löschen werden die Notizen nur als gelöscht markiert und sie können innerhalb eines bestimmten Zeitraums (im Dialogfeld „Letzte Änderungen“) wiederhergestellt werden. Wenn du diese Option aktivierst, werden die Notizen sofort gelöscht und es ist nicht möglich, die Notizen wiederherzustellen.",
"erase_notes_description":"Lösche Notizen sofort. Diese Aktion kann nicht rückgängig gemacht werden und erfordert einen Neustart der Applikation.",
"erase_notes_warning":"Notizen dauerhaft löschen (kann nicht rückgängig gemacht werden), einschließlich aller Klone. Dadurch wird ein Neuladen der Anwendung erzwungen.",
"notes_to_be_deleted":"Folgende Notizen werden gelöscht ({{notesCount}})",
"notes_to_be_deleted":"({{notesCount}}) Notizen werden gelöscht",
"no_note_to_delete":"Es werden keine Notizen gelöscht (nur Klone).",
"broken_relations_to_be_deleted":"Folgende Beziehungen werden gelöst und gelöscht ({{relationCount}})",
"confirm_undelete":"Möchten Sie diese Notiz und ihre Unternotizen wiederherstellen?"
},
"revisions":{
"note_revisions":"Notizrevisionen",
"delete_all_revisions":"Lösche alle Revisionen dieser Notiz",
"delete_all_button":"Alle Revisionen löschen",
"help_title":"Hilfe zu Notizrevisionen",
"confirm_delete_all":"Möchtest du alle Revisionen dieser Notiz löschen?",
"no_revisions":"Für diese Notiz gibt es noch keine Revisionen...",
"confirm_restore":"Möchtest du diese Revision wiederherstellen? Dadurch werden der aktuelle Titel und Inhalt der Notiz mit dieser Revision überschrieben.",
"confirm_delete":"Möchtest du diese Revision löschen?",
"revisions_deleted":"Notizrevisionen wurden gelöscht.",
"revision_restored":"Die Notizrevision wurde wiederhergestellt.",
"revision_deleted":"Notizrevision wurde gelöscht.",
"calendar_root":"Markiert eine Notiz, die als Basis für Tagesnotizen verwendet werden soll. Nur einer sollte als solcher gekennzeichnet sein.",
"archived":"Notizen mit dieser Bezeichnung werden standardmäßig nicht in den Suchergebnissen angezeigt (auch nicht in den Dialogen „Springen zu“, „Link hinzufügen“ usw.).",
"exclude_from_export":"Notizen (mit ihrem Unterbaum) werden nicht im Notizexport inkludiert",
"run":"Definiert, bei welchen Ereignissen das Skript ausgeführt werden soll. Mögliche Werte sind:\n<ul>\n<li>frontendStartup - wenn das Trilium-Frontend startet (oder aktualisiert wird), außer auf mobilen Geräten.</li>\n<li>mobileStartup - wenn das Trilium-Frontend auf einem mobilen Gerät startet (oder aktualisiert wird).</li>\n<li>backendStartup - wenn das Trilium-Backend startet</li>\n<li>hourly - einmal pro Stunde ausführen. Du kannst das zusätzliche Label <code>runAtHour</code> verwenden, um die genaue Stunde festzulegen.</li>\n<li>daily - einmal pro Tag ausführen</li>\n</ul>",
"run":"Definiert bei welchen Ereignissen das Skript ausgeführt werden soll. Mögliche Werte sind:\n<ul>\n<li>frontendStartup - wenn das Trilium-Frontend startet (oder aktualisiert wird), außer auf mobilen Geräten.</li>\n<li>mobileStartup - wenn das Trilium-Frontend auf einem mobilen Gerät startet (oder aktualisiert wird).</li>\n<li>backendStartup - wenn das Trilium-Backend startet.</li>\n<li>hourly - einmal pro Stunde ausführen. Du kannst das zusätzliche Label <code>runAtHour</code> verwenden, um die genaue Stunde festzulegen.</li>\n<li>daily - einmal pro Tag ausführen</li>\n</ul>",
"run_on_instance":"Definiere, auf welcher Trilium-Instanz dies ausgeführt werden soll. Standardmäßig alle Instanzen.",
"run_at_hour":"Zu welcher Stunde soll das laufen? Sollte zusammen mit <code>#runu003dhourly</code> verwendet werden. Kann für mehr Läufe im Laufe des Tages mehrfach definiert werden.",
"disable_inclusion":"Skripte mit dieser Bezeichnung werden nicht in die Ausführung des übergeordneten Skripts einbezogen.",
@@ -446,7 +438,8 @@
"and_more":"... und {{count}} mehr.",
"print_landscape":"Beim Export als PDF, wird die Seitenausrichtung Querformat anstatt Hochformat verwendet.",
"print_page_size":"Beim Export als PDF, wird die Größe der Seite angepasst. Unterstützte Größen: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>.",
"color_type":"Farbe"
"color_type":"Farbe",
"textarea":"Mehrzeilen-Text"
},
"attribute_editor":{
"help_text_body1":"Um ein Label hinzuzufügen, gebe einfach z.B. ein. <code>#rock</code> oder wenn du auch einen Wert hinzufügen möchten, dann z.B. <code>#year = 2024</code>",
@@ -705,7 +698,8 @@
"export_as_image_svg":"SVG (Vektor)",
"note_map":"Notizen Karte",
"view_revisions":"Notizrevisionen...",
"advanced":"Erweitert"
"advanced":"Erweitert",
"view_ocr_text":"OCR text anzeigen"
},
"onclick_button":{
"no_click_handler":"Das Schaltflächen-Widget „{{componentId}}“ hat keinen definierten Klick-Handler"
@@ -801,7 +795,10 @@
"expand_tooltip":"Erweitert die direkten Unterelemente dieser Sammlung (eine Ebene tiefer). Für weitere Optionen auf den Pfeil rechts klicken.",
"hide_child_notes":"Untergeordnete Notizen im Baum ausblenden"
"hide_child_notes":"Untergeordnete Notizen im Baum ausblenden",
"open_all_in_tabs":"Alle öffnen",
"open_all_in_tabs_tooltip":"Alle Resultate in neuen Tabs öffnen",
"open_all_confirm":"Dies öffnet {{count}} Notizen in neuen Tabs. Fortfahren?"
},
"edited_notes":{
"no_edited_notes_found":"An diesem Tag wurden noch keine Notizen bearbeitet...",
@@ -855,7 +852,8 @@
"collapse":"Auf normale Größe reduzieren",
"title":"Notizkarte",
"fix-nodes":"Knoten fixieren",
"link-distance":"Verbindungslänge"
"link-distance":"Verbindungslänge",
"too-many-notes":"Dieser Unterbaum enthält {{count}} Notizen, welche die Limitierung von {{max}} überschreitet die in der Notizkarte dargestellt werden können."
},
"note_paths":{
"title":"Notizpfade",
@@ -903,7 +901,7 @@
"limit":"Limit",
"limit_description":"Begrenze die Anzahl der Ergebnisse",
"debug":"debuggen",
"debug_description":"Debug gibt zusätzliche Debuginformationen in die Konsole aus, um das Debuggen komplexer Abfragen zu erleichtern",
"debug_description":"Debug gibt zusätzliche Protokolleinträge in der Konsole aus, um die Fehlerdiagnose komplexer Abfragen zu erleichtern",
"action":"Aktion",
"search_button":"Suchen",
"search_execute":"Aktionen suchen und ausführen",
@@ -935,7 +933,7 @@
},
"debug":{
"debug":"Debuggen",
"debug_info":"Debug gibt zusätzliche Debuginformationen in die Konsole aus, um das Debuggen komplexer Abfragen zu erleichtern.",
"debug_info":"Debug gibt zusätzliche Protokolleinträge in der Konsole aus, um die Fehlerdiagnose komplexer Abfragen zu erleichtern.",
"access_info":"Um auf die Debug-Informationen zuzugreifen, führe die Abfrage aus und klicke oben links auf \"Backend-Log anzeigen\"."
},
"fast_search":{
@@ -1046,7 +1044,6 @@
"unprotecting-title":"Ungeschützt-Status"
},
"relation_map":{
"open_in_new_tab":"In neuem Tab öffnen",
"remove_note":"Notiz entfernen",
"edit_title":"Titel bearbeiten",
"rename_note":"Notiz umbenennen",
@@ -1061,7 +1058,8 @@
"note_already_in_diagram":"Die Notiz \"{{title}}\" ist schon im Diagram.",
"enter_title_of_new_note":"Gebe den Titel der neuen Notiz ein",
"default_new_note_title":"neue Notiz",
"click_on_canvas_to_place_new_note":"Klicke auf den Canvas, um eine neue Notiz zu platzieren"
"click_on_canvas_to_place_new_note":"Klicke auf den Canvas, um eine neue Notiz zu platzieren",
"rename_relation":"Beziehung umbenennen"
},
"backend_log":{
"refresh":"Aktualisieren"
@@ -1070,15 +1068,17 @@
"title":"Konsistenzprüfungen",
"find_and_fix_button":"Finde und behebe die Konsistenzprobleme",
"finding_and_fixing_message":"Konsistenzprobleme finden und beheben...",
"full_anonymization_description":"Durch diese Aktion wird eine neue Kopie der Datenbank erstellt und anonymisiert (der gesamte Notizinhalt wird entfernt und nur die Struktur und einige nicht vertrauliche Metadaten bleiben übrig), sodass sie zu Debugging-Zwecken online geteilt werden kann, ohne befürchten zu müssen, dass Ihre persönlichen Daten verloren gehen.",
"full_anonymization_description":"Erstellt eine Kopie der Datenbank, wo der Inhalt der Notizen entfernt wurde. Es vergleicht lediglich die Struktur sowie nicht-kritische Metadaten. Sicher zum teilen für die Fehlerdiagnose.",
"save_fully_anonymized_database":"Speichere eine vollständig anonymisierte Datenbank",
"light_anonymization":"Leichte Anonymisierung",
"light_anonymization_description":"Durch diese Aktion wird eine neue Kopie der Datenbank erstellt und eine leichte Anonymisierung vorgenommen – insbesondere wird nur der Inhalt aller Notizen entfernt, Titel und Attribute bleiben jedoch erhalten. Darüber hinaus bleiben benutzerdefinierte JS-Frontend-/Backend-Skriptnotizen und benutzerdefinierte Widgets erhalten. Dies bietet mehr Kontext zum Debuggen der Probleme.",
"light_anonymization_description":"Erstellt eine Kopie wo der Inhalt der Notiz entfernt ist, jedoch Title, Attribute und benutzerdefinierte Skripte erhalten bleiben. Hilfreich zur Fehlerdiagnose.",
"choose_anonymization":"Du kannst selbst entscheiden, ob du eine vollständig oder leicht anonymisierte Datenbank bereitstellen möchten. Selbst eine vollständig anonymisierte Datenbank ist sehr nützlich. In einigen Fällen kann jedoch eine leicht anonymisierte Datenbank den Prozess der Fehlererkennung und -behebung beschleunigen.",
"save_lightly_anonymized_database":"Speichere eine leicht anonymisierte Datenbank",
"error_creating_anonymized_database":"Die anonymisierte Datenbank konnte nicht erstellt werden. Überprüfe die Backend-Protokolle auf Details",
"successfully_created_fully_anonymized_database":"Vollständig anonymisierte Datenbank in {{anonymizedFilePath}} erstellt",
"successfully_created_lightly_anonymized_database":"Leicht anonymisierte Datenbank in {{anonymizedFilePath}} erstellt",
"no_anonymized_database_yet":"Noch keine anonymisierte Datenbank."
"no_anonymized_database_yet":"Noch keine anonymisierte Datenbank.",
"description":"Erstellt eine anonymisierte Kopie deiner Datenbank für den Austausch mit Entwicklern zur Fehlerdiagnose, ohne persönliche Daten preiszugeben."
},
"database_integrity_check":{
"title":"Datenbankintegritätsprüfung",
"description":"Dadurch wird überprüft, ob die Datenbank auf SQLite-Ebene nicht beschädigt ist. Abhängig von der DB-Größe kann es einige Zeit dauern.",
"check_button":"Überprüfe die Datenbankintegrität",
"force_full_sync_description":"Vollständige Synchronisation mit dem Sync-Server auslösen, lädt alle Änderungen erneut hoch."
},
"vacuum_database":{
"title":"Datenbank aufräumen",
"description":"Dadurch wird die Datenbank neu erstellt, was normalerweise zu einer kleineren Datenbankdatei führt. Es werden keine Daten tatsächlich geändert.",
"button_text":"Datenbank aufräumen",
"vacuuming_database":"Datenbank wird geleert...",
"database_vacuumed":"Die Datenbank wurde geleert"
"database_vacuumed":"Die Datenbank wurde geleert",
"vacuum_label":"Datenbank bereinigen",
"vacuum_description":"Datenbank neu aufbauen um die Dateigröße zu reduzieren. Keine Daten werden verändert."
},
"fonts":{
"theme_defined":"Thema definiert",
@@ -1123,10 +1129,7 @@
"note_tree_font":"Notizbaum-Schriftart",
"note_detail_font":"Notiz-Detail-Schriftart",
"monospace_font":"Minivan (Code) Schriftart",
"note_tree_and_detail_font_sizing":"Beachte, dass die Größe der Baum- und Detailschriftarten relativ zur Hauptschriftgrößeneinstellung ist.",
"not_all_fonts_available":"Möglicherweise sind nicht alle aufgelisteten Schriftarten auf Ihrem System verfügbar.",
"apply_font_changes":"Um Schriftartänderungen zu übernehmen, klicke auf",
"reload_frontend":"Frontend neu laden",
"not_all_fonts_available":"Möglicherweise sind nicht alle aufgelisteten Schriftarten auf Ihrem System verfügbar",
"layout-horizontal-description":"Startleiste ist unter der Tableiste. Die Tableiste wird dadurch auf die ganze Breite erweitert.",
"auto_theme":"Alt (Folge dem Farbschema des Systems)",
"light_theme":"Alt (Hell)",
"dark_theme":"Alt (Dunkel)"
"dark_theme":"Alt (Dunkel)",
"modern_themes":"Modern",
"legacy_themes":"Veraltet",
"custom_themes":"Benutzerdefiniert"
},
"zoom_factor":{
"title":"Zoomfaktor (nur Desktop-Build)",
@@ -1196,18 +1204,25 @@
},
"images":{
"images_section_title":"Bilder",
"download_images_automatically":"Lade Bilder automatisch herunter, um sie offline zu verwenden.",
"download_images_description":"Eingefügter HTML-Code kann Verweise auf Online-Bilder enthalten. Trilium findet diese Verweise und lädt die Bilder herunter, sodass sie offline verfügbar sind.",
"ocr_auto_process_description":"Text automatisch extrahieren von neu hochgeladenen oder eingefügten Dateien.",
"ocr_min_confidence":"Minimale Sicherheit"
},
"attachment_erasure_timeout":{
"attachment_erasure_timeout":"Zeitüberschreitung beim Löschen von Anhängen",
"attachment_auto_deletion_description":"Anhänge werden automatisch gelöscht (und gelöscht), wenn sie nach einer definierten Zeitspanne nicht mehr in ihrer Notiz referenziert werden.",
"manual_erasing_description":"Manuelle Löschung aktivieren, ignoriert den obigen Zeitpunkt.",
"erase_unused_attachments_now":"Lösche jetzt nicht verwendete Anhangnotizen",
"unused_attachments_erased":"Nicht verwendete Anhänge wurden gelöscht."
},
@@ -1217,28 +1232,30 @@
},
"note_erasure_timeout":{
"note_erasure_timeout_title":"Beachte das Zeitlimit für die Löschung",
"note_erasure_description":"Gelöschte Notizen (und Attribute, Notizrevisionen...) werden zunächst nur als gelöscht markiert und können über den Dialog „Zuletzt verwendete Notizen” wiederhergestellt werden. Nach einer bestimmten Zeit werden gelöschte Notizen „gelöscht”, was bedeutet, dass ihr Inhalt nicht mehr wiederhergestellt werden kann. Mit dieser Einstellung können Sie die Zeitspanne zwischen dem Löschen und dem endgültigen Löschen der Notiz festlegen.",
"erase_notes_after":"Notizen löschen nach:",
"manual_erasing_description":"Du kannst das Löschen auch manuell auslösen (ohne Berücksichtigung des oben definierten Timeouts):",
"erase_notes_after":"Notizen löschen nach",
"manual_erasing_description":"Manuelle Löschung aktivieren, ignoriert den obigen Zeitpunkt.",
"deleted_notes_erased":"Gelöschte Notizen wurden gelöscht."
},
"revisions_snapshot_interval":{
"note_revisions_snapshot_interval_title":"Snapshot-Intervall für Notizrevisionen",
"note_revisions_snapshot_description":"Das Snapshot-Zeitintervall für Notizrevisionen ist die Zeit, nach der eine neue Notizrevision erstellt wird. Weitere Informationen findest du im <doc>Wiki</doc>.",
"snapshot_time_interval_label":"Zeitintervall für Notiz-Revisions-Snapshot:"
"note_revisions_snapshot_interval_title":"Schnappschuss-Intervall für Notizrevisionen",
"note_revisions_snapshot_description":"Das Schnappschuss-Zeitintervall für Notizrevisionen ist die Zeit, nach der eine neue Notizrevision erstellt wird. Weitere Informationen finden Sie im <doc>Wiki</doc>.",
"note_revisions_snapshot_description_short":"Zeit, nachdem eine neue Notizrevision erstellt wird."
},
"revisions_snapshot_limit":{
"note_revisions_snapshot_limit_title":"Limit für Notizrevision-Snapshots",
"note_revisions_snapshot_limit_description":"Das Limit für Notizrevision-Snapshots bezieht sich auf die maximale Anzahl von Revisionen, die für jede Notiz gespeichert werden können. Dabei bedeutet -1, dass es kein Limit gibt, und 0 bedeutet, dass alle Revisionen gelöscht werden. Du kannst das maximale Limit für Revisionen einer einzelnen Notiz über das Label #versioningLimit festlegen.",
"snapshot_number_limit_label":"Limit der Notizrevision-Snapshots:",
"erase_excess_revision_snapshots_prompt":"Überschüssige Revision-Snapshots wurden gelöscht.",
"snapshot_number_limit_unit":"Momentaufnahmen"
"snapshot_number_limit_unit":"Momentaufnahmen",
"note_revisions_snapshot_limit_description_short":"Maximale Anzahl an Revisionen pro Notiz. Nutze -1 für unlimitiert oder 0 zum deaktivieren.",
"erase_excess_revision_snapshots_description":"Lösche Revisionen aller Notizen die das Limit überschreiten."
},
"search_engine":{
"title":"Suchmaschine",
"custom_search_engine_info":"Für eine benutzerdefinierte Suchmaschine müssen sowohl ein Name als auch eine URL festgelegt werden. Wenn keine dieser Optionen festgelegt ist, wird DuckDuckGo als Standardsuchmaschine verwendet.",
"custom_search_engine_info":"Wird verwendet bei der Suche im Web für den ausgewählten Text. Wenn nicht konfiguriert, wird DuckDuckGo verwendet.",
"first-week-contains-first-thursday":"Erste Woche enthält den ersten Donnerstag des Jahres",
"first-week-has-minimum-days":"Erste Woche hat Mindestanzahl an Tagen",
"min-days-in-first-week":"Mindestanzahl an Tagen in erster Woche",
"first-week-info":"Die erste Woche, die den ersten Donnerstag des Jahres enthält, basiert auf dem Standard <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>.",
"first-week-warning":"Das Ändern der Optionen für die erste Woche kann zu Duplikaten mit bestehenden Wochen-Notizen führen. Bestehende Wochen-Notizen werden nicht entsprechend aktualisiert.",
"formatting-locale":"Datums- und Zahlenformat",
"tuesday":"Dienstag",
@@ -1319,7 +1335,9 @@
"date-and-time":"Datum & Uhrzeit",
"path":"Pfad",
"database_backed_up_to":"Die Datenbank wurde gesichert unter {{backupFilePath}}",
"no_backup_yet":"noch kein Backup"
"no_backup_yet":"noch kein Backup",
"title":"Sicherung",
"download":"Download"
},
"etapi":{
"title":"ETAPI",
@@ -1358,14 +1376,17 @@
"protected_session_timeout_description":"Das Zeitlimit für geschützte Sitzungen ist ein Zeitraum, nach dem die geschützte Sitzung aus dem Speicher des Browsers gelöscht wird. Dies wird ab der letzten Interaktion mit geschützten Notizen gemessen. Sehen",
"wiki":"Wiki",
"for_more_info":"für weitere Informationen.",
"protected_session_timeout_label":"Zeitüberschreitung der geschützten Sitzung:",
"protected_session_timeout_label":"Automatisches beenden der Sitzung nach",
"reset_confirmation":"Durch das Zurücksetzen des Passworts verlierst du für immer den Zugriff auf alle Ihre bestehenden geschützten Notizen. Möchtest du das Passwort wirklich zurücksetzen?",
"reset_success_message":"Das Passwort wurde zurückgesetzt. Bitte lege ein neues Passwort fest",
"change_password_heading":"Kennwort ändern",
"set_password_heading":"Passwort festlegen",
"set_password":"Passwort festlegen",
"password_mismatch":"Neue Passwörter sind nicht dasselbe.",
"password_changed_success":"Das Passwort wurde geändert. Trilium wird neu geladen, nachdem du auf OK geklickt hast."
"password_changed_success":"Das Passwort wurde geändert. Trilium wird neu geladen, nachdem du auf OK geklickt hast.",
"change_password_description":"Aktualisiere dein aktuelles Passwort",
"reset_password":"Passwort zurücksetzen",
"cancel":"Abbrechen"
},
"shortcuts":{
"keyboard_shortcuts":"Tastaturkürzel",
@@ -1386,26 +1407,22 @@
"description":"Diese Optionen gelten nur für Desktop-Builds. Browser verwenden ihre eigene native Rechtschreibprüfung.",
"enable":"Aktiviere die Rechtschreibprüfung",
"language_code_label":"Sprachcode(s)",
"language_code_placeholder":"zum Beispiel \"en-US\", \"de-AT\"",
"multiple_languages_info":"Mehrere Sprachen können mit einem Komma getrennt werden z.B. \"en-US, de-DE, cs\". ",
"note_description":"Wenn du die Proxy-Einstellung leer lässt, wird der System-Proxy verwendet (gilt nur für Desktop-/Electron-Build).",
"special_value_description":"Ein weiterer besonderer Wert ist <code>noproxy</code>, der das Ignorieren sogar des System-Proxys erzwingt und <code>NODE_TLS_REJECT_UNAUTHORIZED</code> respektiert.",
"save":"Speichern",
"help":"Helfen",
"test_title":"Synchronisierungstest",
"test_description":"Dadurch werden die Verbindung und der Handshake zum Synchronisierungsserver getestet. Wenn der Synchronisierungsserver nicht initialisiert ist, wird er dadurch für die Synchronisierung mit dem lokalen Dokument eingerichtet.",
"test_button":"Teste die Synchronisierung",
"handshake_failed":"Handshake des Synchronisierungsservers fehlgeschlagen, Fehler: {{message}}",
"timeout_unit":"Millisekunden"
"handshake_failed":"Handshake des Synchronisierungsservers fehlgeschlagen, Fehler: {{message}}"
},
"api_log":{
"close":"Schließen"
@@ -1488,20 +1505,22 @@
"mermaid-diagram":"Mermaid Diagramm",
"canvas":"Leinwand",
"web-view":"Webansicht",
"mind-map":"Mind Map",
"mind-map":"Mindmap",
"file":"Datei",
"image":"Bild",
"launcher":"Starter",
"doc":"Dokument",
"widget":"Widget",
"confirm-change":"Es is nicht empfehlenswert den Notiz-Typ zu ändern, wenn der Inhalt der Notiz nicht leer ist. Möchtest du dennoch fortfahren?",
"confirm-change":"Es ist nicht empfehlenswert den Notiz-Typ zu ändern, wenn der Inhalt der Notiz nicht leer ist. Möchtest du dennoch fortfahren?",
"geo-map":"Geo-Karte",
"beta-feature":"Beta",
"book":"Sammlung",
"ai-chat":"KIChat",
"ai-chat":"KI-Chat",
"task-list":"Aufgabenliste",
"new-feature":"Neu",
"collections":"Sammlungen"
"collections":"Sammlungen",
"spreadsheet":"Tabelle",
"llm-chat":"KI-Chat"
},
"protect_note":{
"toggle-on":"Notiz schützen",
@@ -1703,7 +1722,8 @@
"theme_none":"Keine Syntaxhervorhebung",
"theme_group_light":"Helle Themen",
"theme_group_dark":"Dunkle Themen",
"copy_title":"Kopiere in Zwischenablage"
"copy_title":"Kopiere in Zwischenablage",
"click_to_copy":"Klicke zum kopieren"
},
"classic_editor_toolbar":{
"title":"Format"
@@ -1722,7 +1742,7 @@
"title":"Fixiert",
"description":"Werkzeuge erscheinen im \"Format\" Tab."
},
"multiline-toolbar":"Toolbar wenn nötig in mehreren Zeilen darstellen."
"multiline-toolbar":"Toolbar wenn nötig in mehreren Zeilen darstellen"
}
},
"electron_context_menu":{
@@ -1813,8 +1833,9 @@
"custom_date_time_format":{
"title":"Benutzerdefiniertes Datums-/Zeitformat",
"description":"Passe das Format des Datums und der Uhrzeit an, die über <shortcut /> oder die Symbolleiste eingefügt werden. Die verfügbaren Format-Tokens sind unter <doc>Day.js docs</doc> zu finden.",
"format_string":"Format Zeichenfolge:",
"formatted_time":"Formatiertes Datum/Uhrzeit:"
"format_string":"Format Zeichenfolge",
"formatted_time":"Formatiertes Datum/Uhrzeit",
"preview":"Vorschau: {{preview}}"
},
"multi_factor_authentication":{
"title":"Multi-Faktor-Authentifizierung",
@@ -2045,7 +2066,9 @@
"title":"Experimentelle Optionen",
"disclaimer":"Diese Optionen sind experimentell und können Instabilitäten verursachen. Achtsam zu verwenden.",
"new_layout_name":"Neues Layout",
"new_layout_description":"Probiere das neue Layout für eine modernere Darstellung und verbesserte Benutzbarkeit aus. Kann sich in Zukunft stark ändern."
"new_layout_description":"Probiere das neue Layout für eine modernere Darstellung und verbesserte Benutzbarkeit aus. Kann sich in Zukunft stark ändern.",
"llm_name":"KI- / LLM-Chat",
"llm_description":"Aktiviert die KI-Chat Seitenleiste sowie LLM-Chat Notizen die von einem Sprachmodell betrieben werden."
},
"server":{
"unknown_http_error_title":"Kommunikationsfehler mit dem Server",
"confirm_restore":"Möchten sie diese Revision wiederherstellen? Diese Aktion überschreibt den aktuellen Titel und Inhalt der Notiz mit dieser Revision.",
"delete_button":"Löschen",
"confirm_delete":"Möchten Sie diese Revision löschen?",
"revisions_deleted":"Notiz-Revisionen wurden gelöscht.",
"revision_restored":"Notiz-Revisionen wurden wiederhergestellt.",
"revision_deleted":"Revision wurde gelöscht.",
"snapshot_interval":"Speicherintervall für Revisionsverlauf: {{seconds}} Sek.",
"maximum_revisions":"Maximale Anzahl an gespeicherten Revisionen einer Notiz: {{number}}.",
"message":"A critical error has occurred which prevents the client application from starting:\n\n{{message}}\n\nThis is most likely caused by a script failing in an unexpected way. Try starting the application in safe mode and addressing the issue."
},
"widget-error":{
"title":"Failed to initialise a widget",
"message-custom":"Custom widget from note with ID \"{{id}}\", titled \"{{title}}\" could not be initialised due to:\n\n{{message}}",
"message-unknown":"Unknown widget could not be initialised due to:\n\n{{message}}"
},
"bundle-error":{
"title":"Failed to load a custom script",
"message":"Script could not be executed due to:\n\n{{message}}"
},
"widget-list-error":{
"title":"Failed to obtain the list of widgets from the server"
},
"widget-render-error":{
"title":"Failed to render a custom React widget"
},
"widget-missing-parent":"Custom widget does not have mandatory '{{property}}' property defined.\n\nIf this script is meant to be run without a UI element, use '#run=frontendStartup' instead.",
"newTabNoteLink":"on note link opens note in a new tab",
"newTabWithActivationNoteLink":"on note link opens and activates the note in a new tab",
"onlyInDesktop":"Only in desktop (Electron build)",
"openEmptyTab":"open empty tab",
"closeActiveTab":"close active tab",
"activatePreviousTab":"activate previous tab",
"creatingNotes":"Creating notes",
"createNoteAfter":"create new note after the active note",
"createNoteInto":"create new sub-note into active note",
"editBranchPrefix":"edit <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/tree-concepts.html#prefix\">prefix</a> of active note clone",
"movingCloningNotes":"Moving / cloning notes",
"moveNoteUpDown":"move note up/down in the note list",
"moveNoteUpHierarchy":"move note up in the hierarchy",
"selectAllNotes":"select all notes in the current level",
"selectNote":"select note",
"copyNotes":"copy active note (or current selection) into clipboard (used for <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">cloning</a>)",
"cutNotes":"cut current note (or current selection) into clipboard (used for moving notes)",
"pasteNotes":"paste note(s) as sub-note into active note (which is either move or clone depending on whether it was copied or cut into clipboard)",
"deleteNotes":"delete note / sub-tree",
"editingNotes":"Editing notes",
"editNoteTitle":"in tree pane will switch from tree pane into note title. Enter from note title will switch focus to text editor. <kbd>Ctrl+.</kbd> will switch back from editor to tree pane.",
"createEditLink":"create / edit external link",
"createInternalLink":"create internal link",
"followLink":"follow link under cursor",
"insertDateTime":"insert current date and time at caret position",
"jumpToTreePane":"jump away to the tree pane and scroll to active note",
"title":"Rendu impossible d'un widget React custom"
}
},
"widget-missing-parent":"Le widget personnalisé ne comprend pas de propriété '{{property}}' définie\n\nSi ce script est prévu pour être exécuté sans fonctionnalité UI, utilisez '#run=frontendStartup' plutôt.",
"open-script-note":"Ouvrir une note script",
"scripting-error":"Échec du script personnalisé : {{title}}"
},
"add_link":{
"add_link":"Ajouter un lien",
@@ -46,7 +42,7 @@
"prefix":"Préfixe : ",
"save":"Sauvegarder",
"branch_prefix_saved":"Le préfixe de la branche a été enregistré.",
"edit_branch_prefix_multiple":"Modifier le préfixe de branche pour {{count}} branches",
"edit_branch_prefix_multiple":"Modifier le préfixe pour {{count}} branches",
"branch_prefix_saved_multiple":"Le préfixe de la branche a été sauvegardé pour {{count}} branches.",
"delete_all_clones_description":"Supprimer aussi les clones (peut être annulé dans des modifications récentes)",
"erase_notes_description":"La suppression normale (douce) marque uniquement les notes comme supprimées et elles peuvent être restaurées (dans la boîte de dialogue des Modifications récentes) dans un délai donné. Cocher cette option effacera les notes immédiatement et il ne sera pas possible de les restaurer.",
@@ -94,8 +89,9 @@
"no_note_to_delete":"Aucune note ne sera supprimée (uniquement les clones).",
"broken_relations_to_be_deleted":"Les relations suivantes seront rompues et supprimées ({{ relationCount}})",
"cancel":"Annuler",
"ok":"OK",
"deleted_relation_text":"Note {{- note}} (à supprimer) est référencée dans la relation {{- relation}} provenant de {{- source}}."
"title":"Notes supprimées",
"clones_label":"Clone",
"erase_notes_label":"Supprimer définitivement"
},
"export":{
"export_note_title":"Exporter la note",
@@ -114,7 +110,7 @@
"export_in_progress":"Exportation en cours:{{progressCount}}",
"export_finished_successfully":"L'exportation s'est terminée avec succès.",
"format_pdf":"PDF - pour l'impression ou le partage de documents.",
"share-format":"HTML pour la publication Web - utilise le même thème que celui utilisé pour les notes partagées, mais peut être publié sous forme de site Web statique."
"share-format":"HTML pour la publication Web: utilise le même thème que celui utilisé pour les notes partagées, mais peut être publié sous forme de site Web statique."
},
"help":{
"noteNavigation":"Navigation dans les notes",
@@ -267,33 +263,6 @@
"undelete_link":"annuler la suppression",
"confirm_undelete":"Voulez-vous restaurer cette note et ses sous-notes?"
},
"revisions":{
"note_revisions":"Versions de la note",
"delete_all_revisions":"Supprimer toutes les versions de cette note",
"delete_all_button":"Supprimer toutes les versions",
"help_title":"Aide sur les versions de notes",
"confirm_delete_all":"Voulez-vous supprimer toutes les versions de cette note?",
"no_revisions":"Aucune version pour cette note pour l'instant...",
"confirm_restore":"Voulez-vous restaurer cette version? Le titre et le contenu actuels de la note seront écrasés par cette version.",
"confirm_delete":"Voulez-vous supprimer cette version?",
"revisions_deleted":"Les versions de notes ont été supprimées.",
"revision_restored":"La version de la note a été restaurée.",
"revision_deleted":"La version de la note a été supprimée.",
"snapshot_interval":"Délai d'enregistrement automatique des versions de notes:{{seconds}}s.",
"maximum_revisions":"Nombre maximal de versions :{{number}}.",
"settings":"Paramètres des versions de notes",
"download_button":"Télécharger",
"mime":"MIME: ",
"file_size":"Taille du fichier:",
"preview_not_available":"L'aperçu n'est pas disponible pour ce type de note.",
"restore_button":"Restaurer",
"delete_button":"Supprimer",
"diff_on":"Afficher les différences",
"diff_off":"Afficher le contenu",
"diff_on_hint":"Cliquer pour afficher les différences avec la note d'origine",
"diff_off_hint":"Cliquer pour afficher le contenu de la note",
"diff_not_available":"La comparaison n'est pas disponible."
},
"sort_child_notes":{
"sort_children_by":"Trier les enfants par...",
"sorting_criteria":"Critères de tri",
@@ -443,7 +412,8 @@
"and_more":"... et {{count}} plus.",
"print_landscape":"Lors de l'exportation en PDF, change l'orientation de la page en paysage au lieu de portrait.",
"print_page_size":"Lors de l'exportation en PDF, change la taille de la page. Valeurs supportées : <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>.",
"color_type":"Couleur"
"color_type":"Couleur",
"textarea":"Texte multiligne"
},
"attribute_editor":{
"help_text_body1":"Pour ajouter un label, tapez simplement par ex. <code>#rock</code>, ou si vous souhaitez également ajouter une valeur, tapez par ex. <code>#année = 2020</code>",
@@ -659,7 +629,8 @@
"show-cheatsheet":"Afficher l'aide rapide",
"toggle-zen-mode":"Zen Mode",
"new-version-available":"Nouvelle mise à jour disponible",
"download-update":"Obtenir la version {{latestVersion}}"
"download-update":"Obtenir la version {{latestVersion}}",
"search_notes":"Rechercher notes"
},
"zen_mode":{
"button_exit":"Sortir du Zen mode"
@@ -703,7 +674,8 @@
"advanced":"Avancé",
"export_as_image":"Exporter en tant qu'image",
"export_as_image_png":"PNG",
"export_as_image_svg":"SVG (vectoriel)"
"export_as_image_svg":"SVG (vectoriel)",
"note_map":"Note Carte"
},
"onclick_button":{
"no_click_handler":"Le widget bouton '{{componentId}}' n'a pas de gestionnaire de clic défini"
@@ -741,23 +713,25 @@
"button_title":"Exporter le diagramme au format SVG"
},
"relation_map_buttons":{
"create_child_note_title":"Créer une nouvelle note enfant et l'ajouter à cette carte de relation",
"create_child_note_title":"Créer une note enfant et l'ajouter à la carte",
"reset_pan_zoom_title":"Réinitialiser le panoramique et le zoom aux coordonnées et à la position initiales",
"zoom_in_title":"Zoomer",
"zoom_out_title":"Zoom arrière"
},
"zpetne_odkazy":{
"relation":"relation",
"backlink_one":"{{count}} Lien inverse",
"backlink_many":"",
"backlink_other":"{{count}} Liens inverses"
"backlink_one":"{{count}} Rétrolien",
"backlink_many":"{{count}} Rétroliens",
"backlink_other":"{{count}} Rétrolien"
},
"mobile_detail_menu":{
"insert_child_note":"Insérer une note enfant",
"delete_this_note":"Supprimer cette note",
"error_cannot_get_branch_id":"Impossible d'obtenir branchId pour notePath '{{notePath}}'",
"error_unrecognized_command":"Commande non reconnue {{command}}",
"note_revisions":"Révision de la note"
"note_revisions":"Révision de la note",
"backlinks":"Rétro-liens",
"content_language_switcher":"Langue du contenu: {{language}}"
"unknown_search_option":"Option de recherche inconnue{{searchOptionName}}",
"search_note_saved":"La note de recherche a été enregistrée dans {{- notePathTitle}}",
"actions_executed":"Les actions ont été exécutées.",
"view_options":"Afficher les options:"
"view_options":"Afficher les options:",
"option":"option"
},
"similar_notes":{
"title":"Notes similaires",
@@ -997,7 +979,7 @@
"no_attachments":"Cette note ne contient aucune pièce jointe."
},
"book":{
"no_children_help":"Cette note de type Livre n'a aucune note enfant, donc il n'y a rien à afficher. Consultez le <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> pour plus de détails.",
"no_children_help":"Cette collection ne contient pas de notes enfants, il n'y a donc rien à afficher.",
"drag_locked_title":"Edition verrouillée",
"drag_locked_message":"Le glisser-déposer n'est pas autorisé car l'édition de cette collection est verrouillé."
},
@@ -1036,7 +1018,6 @@
"unprotecting-title":"Statut de la non-protection"
},
"relation_map":{
"open_in_new_tab":"Ouvrir dans un nouvel onglet",
"remove_note":"Supprimer la note",
"edit_title":"Modifier le titre",
"rename_note":"Renommer la note",
@@ -1081,7 +1062,6 @@
},
"database_integrity_check":{
"title":"Vérification de l'intégrité de la base de données",
"description":"Vérifiera que la base de données n'est pas corrompue au niveau SQLite. Cela peut prendre un certain temps, en fonction de la taille de la base de données.",
"check_button":"Vérifier l'intégrité de la base de données",
"checking_integrity":"Vérification de l'intégrité de la base de données...",
"integrity_check_succeeded":"Le contrôle d'intégrité a réussi-aucun problème détecté.",
@@ -1113,10 +1093,7 @@
"note_tree_font":"Police de l'arborescence",
"note_detail_font":"Police du contenu des notes",
"monospace_font":"Police Monospace (code)",
"note_tree_and_detail_font_sizing":"Notez que la taille de la police de l’arborescence et du contenu est relative au paramètre de taille de police principal.",
"not_all_fonts_available":"Toutes les polices répertoriées peuvent ne pas être disponibles sur votre système.",
"apply_font_changes":"Pour appliquer les modifications de police, cliquez sur",
"reload_frontend":"recharger l'interface",
"generic-fonts":"Polices génériques",
"sans-serif-system-fonts":"Polices système sans serif",
"serif-system-fonts":"Polices système Serif",
@@ -1172,8 +1149,8 @@
},
"code_mime_types":{
"title":"Types MIME disponibles dans la liste déroulante",
"tooltip_syntax_highlighting":"Souligner la syntaxe",
"tooltip_code_block_syntax":"Blocs de code dans les notes de texte",
"tooltip_syntax_highlighting":"Mise en évidence de la syntaxe",
"tooltip_code_block_syntax":"Blocs de code dans les notes textuelles",
"tooltip_code_note_syntax":"Notes de code"
},
"vim_key_bindings":{
@@ -1195,8 +1172,7 @@
},
"attachment_erasure_timeout":{
"attachment_erasure_timeout":"Délai d'effacement des pièces jointes",
"attachment_auto_deletion_description":"Les pièces jointes sont automatiquement supprimées (et effacées) si elles ne sont plus référencées par leur note après un certain délai.",
"erase_attachments_after":"Effacer les pièces jointes inutilisées après :",
"erase_attachments_after":"Effacer les pièces jointes inutilisées après:",
"manual_erasing_description":"Vous pouvez également déclencher l'effacement manuellement (sans tenir compte du délai défini ci-dessus) :",
"erase_unused_attachments_now":"Effacez maintenant les pièces jointes inutilisées",
"unused_attachments_erased":"Les pièces jointes inutilisées ont été effacées."
@@ -1207,7 +1183,6 @@
},
"note_erasure_timeout":{
"note_erasure_timeout_title":"Délai d'effacement des notes",
"note_erasure_description":"Les notes supprimées (et les attributs, versions...) sont seulement marquées comme supprimées et il est possible de les récupérer à partir de la boîte de dialogue Notes récentes. Après un certain temps, les notes supprimées sont « effacées », ce qui signifie que leur contenu n'est plus récupérable. Ce paramètre vous permet de configurer la durée entre la suppression et l'effacement de la note.",
"erase_notes_after":"Effacer les notes après:",
"manual_erasing_description":"Vous pouvez également déclencher l'effacement manuellement (sans tenir compte de la durée définie ci-dessus) :",
"erase_deleted_notes_now":"Effacer les notes supprimées maintenant",
@@ -1291,7 +1266,6 @@
"first-week-contains-first-thursday":"La première semaine contient le premier jeudi de l'année",
"first-week-has-minimum-days":"La première semaine a un nombre minimum de jours",
"min-days-in-first-week":"Nombre minimum de jours dans la première semaine",
"first-week-info":"La première semaine contient le premier jeudi de l'année et est basée sur la norme <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a> .",
"first-week-warning":"La modification des options de la première semaine peut entraîner des doublons avec les notes de semaine existantes et les notes de semaine existantes ne seront pas mises à jour en conséquence.",
"formatting-locale":"Format de date et de nombre",
"formatting-locale-auto":"En fonction de la langue de l'application"
@@ -1368,16 +1342,14 @@
"description":"Description",
"reload_app":"Recharger l'application pour appliquer les modifications",
"set_all_to_default":"Réinitialiser aux valeurs par défaut",
"confirm_reset":"Voulez-vous vraiment réinitialiser tous les raccourcis clavier par défaut?"
"confirm_reset":"Voulez-vous vraiment réinitialiser tous les raccourcis clavier par défaut?",
"no_results":"Aucun raccourci correspondant à '{{filter}}'"
},
"spellcheck":{
"title":"Vérification orthographique",
"description":"Ces options s'appliquent uniquement aux versions de bureau, les navigateurs utiliseront leur propre vérification orthographique native.",
"enable":"Activer la vérification orthographique",
"language_code_label":"Code(s) de langue",
"language_code_placeholder":"par exemple \"fr-FR\", \"en-US\", \"de-AT\"",
"multiple_languages_info":"Plusieurs langues peuvent être séparées par une virgule, par ex. \"fr-FR, en-US, de-DE, cs\". ",
"available_language_codes_label":"Codes de langue disponibles:",
"restart-required":"Les modifications apportées aux options de vérification orthographique prendront effet après le redémarrage de l'application."
},
"sync_2":{
@@ -1385,16 +1357,12 @@
"server_address":"Adresse de l'instance du serveur",
"timeout":"Délai d'expiration de la synchronisation (millisecondes)",
"proxy_label":"Serveur proxy de synchronisation (facultatif)",
"note":"Note",
"note_description":"Si vous laissez le paramètre de proxy vide, le proxy système sera utilisé (applicable uniquement à la version de bureau/électronique).",
"special_value_description":"Une autre valeur spéciale est <code>noproxy</code> qui oblige à ignorer même le proxy système et respecte <code>NODE_TLS_REJECT_UNAUTHORIZED</code>.",
"save":"Sauvegarder",
"help":"Aide",
"test_title":"Test de synchronisation",
"test_description":"Testera la connexion et la prise de contact avec le serveur de synchronisation. Si le serveur de synchronisation n'est pas initialisé, cela le configurera pour qu'il se synchronise avec le document local.",
"test_button":"Tester la synchronisation",
"handshake_failed":"Échec de la négociation avec le serveur de synchronisation, erreur:{{message}}",
"timeout_unit":"millisecondes"
"handshake_failed":"Échec de la négociation avec le serveur de synchronisation, erreur:{{message}}"
},
"api_log":{
"close":"Fermer"
@@ -1403,7 +1371,7 @@
"will_be_deleted_in":"Cette pièce jointe sera automatiquement supprimée dans {{time}}",
"will_be_deleted_soon":"Cette pièce jointe sera bientôt supprimée automatiquement",
"deletion_reason":", car la pièce jointe n'est pas liée dans le contenu de la note. Pour empêcher la suppression, ajoutez à nouveau le lien de la pièce jointe dans le contenu d'une note ou convertissez la pièce jointe en note.",
"link_copied":"Lien de pièce jointe copié dans le presse-papiers.",
"unrecognized_role":"Rôle de pièce jointe « {{role}} » non reconnu."
},
@@ -1454,10 +1422,13 @@
"import-into-note":"Importer dans la note",
"apply-bulk-actions":"Appliquer des Actions groupées",
"converted-to-attachments":"Les notes {{count}} ont été converties en pièces jointes.",
"convert-to-attachment-confirm":"Êtes-vous sûr de vouloir convertir les notes sélectionnées en pièces jointes de leurs notes parentes ?",
"convert-to-attachment-confirm":"Êtes-vous sûr de vouloir convertir les notes sélectionnées en pièces jointes de leurs notes parentales? Cette opération s'applique uniquement aux notes d'image, les autres notes seront ignorées.",
"archive":"Archive",
"unarchive":"Désarchiver",
"open-in-popup":"Modification rapide"
"open-in-popup":"Modification rapide",
"open-in-a-new-window":"Ouvrir dans une nouvelle fenêtre",
"hide-subtree":"Masquer le sous-arbre",
"show-subtree":"Afficher le sous-arbre"
},
"shared_info":{
"shared_publicly":"Cette note est partagée publiquement sur {{- link}}.",
@@ -1486,7 +1457,10 @@
"task-list":"Liste de tâches",
"book":"Collection",
"new-feature":"Nouveau",
"collections":"Collections"
"collections":"Collections",
"ai-chat":"Chat IA",
"llm-chat":"Chat AI",
"spreadsheet":"Feuille de calcul"
},
"protect_note":{
"toggle-on":"Protéger la note",
@@ -1517,7 +1491,13 @@
},
"highlights_list_2":{
"title":"Accentuations",
"options":"Options"
"options":"Options",
"title_with_count_one":"{{count}} mise en évidence",
"title_with_count_many":"{{count}} mises en évidence",
"title_with_count_other":"{{count}} mises en évidence",
"modal_title":"Configurer les mises en évidence",
"menu_configure":"Configuration des mises en évidence...",
"no_highlights":"Aucune mise en évidence."
},
"quick-search":{
"placeholder":"Recherche rapide",
@@ -1541,7 +1521,17 @@
"create-child-note":"Créer une note enfant",
"unhoist":"Désactiver le focus",
"toggle-sidebar":"Basculer la barre latérale",
"dropping-not-allowed":"Lâcher des notes à cet endroit n'est pas autorisé"
"dropping-not-allowed":"Déplacer des notes à cet emplacement n'est pas autorisé.",
"clone-indicator-tooltip":"Cette note a {{- count}} parents: {{- parents}}",
"clone-indicator-tooltip-single":"Cette note est clonée (1 parent supplémentaire: {{- parent}})",
"shared-indicator-tooltip":"Cette note est partagée publiquement",
"shared-indicator-tooltip-with-url":"Cette note est partagée publiquement sur: {{- url}}",
"subtree-hidden-tooltip_one":"{{count}} note enfant cachée de l'arbre",
"subtree-hidden-tooltip_many":"{{count}} notes enfants cachées de l'arbre",
"subtree-hidden-tooltip_other":"{{count}} notes enfants cachées de l'arbre",
"subtree-hidden-moved-title":"Ajouté à {{title}}",
"subtree-hidden-moved-description-collection":"Cette collection cache ses notes enfants dans l'arbre.",
"subtree-hidden-moved-description-other":"Les notes enfants sont cachées dans l'arbre pour cette note."
},
"title_bar_buttons":{
"window-on-top":"Épingler cette fenêtre au premier plan"
@@ -1552,7 +1542,12 @@
"printing_pdf":"Export au format PDF en cours...",
"print_report_title":"Imprimer le rapport",
"print_report_collection_details_button":"Consulter les détails",
"print_report_error_title":"Échec de l'impression",
"print_report_stack_trace":"Trace de la pile",
"print_report_collection_content_one":"La {{count}} note de la collection n'a pas pu être imprimée car elle n'est pas prises en charge ou est protégée.",
"print_report_collection_content_many":"Les {{count}} notes de la collection n'ont pas pu être imprimées car elles ne sont pas prises en charge ou sont protégées.",
"print_report_collection_content_other":"Les {{count}} notes de la collection n'ont pas pu être imprimées car elles ne sont pas prises en charge ou sont protégées."
},
"note_title":{
"placeholder":"saisir le titre de la note ici...",
@@ -1561,17 +1556,24 @@
"note_type_switcher_label":"Basculer de {{type}} à :",
"note_type_switcher_others":"Autre type de note",
"note_type_switcher_templates":"Modèle",
"note_type_switcher_collection":"Collection"
"note_type_switcher_collection":"Collection",
"edited_notes":"Notes éditées ce jour",
"promoted_attributes":"Attributs promus"
},
"search_result":{
"no_notes_found":"Aucune note n'a été trouvée pour les paramètres de recherche donnés.",
"search_not_executed":"La recherche n'a pas encore été exécutée. Cliquez sur le bouton \"Rechercher\" ci-dessus pour voir les résultats."
"search_not_executed":"La recherche n'a pas encore été exécutée.",
"search_now":"Recherche maintenant"
},
"spacer":{
"configure_launchbar":"Configurer la Barre de raccourcis"
},
"sql_result":{
"no_rows":"Aucune ligne n'a été renvoyée pour cette requête"
"no_rows":"Aucune ligne n'a été renvoyée pour cette requête",
"not_executed":"La requête n'a pas encore été exécutée.",
"failed":"L'exécution de requêtes SQL a échoué",
"statement_result":"Résultat de la déclaration",
"execute_now":"Exécuter maintenant"
},
"sql_table_schemas":{
"tables":"Tableaux"
@@ -1694,7 +1696,7 @@
"paste":"Coller",
"paste-as-plain-text":"Coller comme texte brut",
"search_online":"Rechercher «{{term}}» avec {{searchEngine}}",
"search_in_trilium":"Rechercher \"{{term}}\" dans Trilium"
"search_in_trilium":"Rechercher « {{term}} » dans Trilium"
},
"image_context_menu":{
"copy_reference_to_clipboard":"Copier la référence dans le presse-papiers",
@@ -1704,14 +1706,15 @@
"open_note_in_new_tab":"Ouvrir la note dans un nouvel onglet",
"open_note_in_new_split":"Ouvrir la note dans une nouvelle division",
"open_note_in_new_window":"Ouvrir la note dans une nouvelle fenêtre",
"open_note_in_popup":"Édition rapide"
"open_note_in_popup":"Édition rapide",
"open_note_in_other_split":"Ouvrir la note dans l'autre volet"
},
"electron_integration":{
"desktop-application":"Application de bureau",
"native-title-bar":"Barre de titre native",
"native-title-bar-description":"Sous Windows et macOS, désactiver la barre de titre native rend l'application plus compacte. Sous Linux, le maintien de la barre de titre native permet une meilleure intégration avec le reste du système.",
"background-effects":"Activer les effets d'arrière-plan (Windows 11 uniquement)",
"background-effects-description":"L'effet Mica ajoute un fond flou et élégant aux fenêtres de l'application, créant une profondeur et un style moderne.",
"background-effects":"Activer les effets d'arrière-plan",
"background-effects-description":"Ajoute un arrière-plan flou et élégant aux fenêtres d'application, créant de la profondeur et un style moderne. La « barre de titre native » doit être désactivée.",
"restart-app-button":"Redémarrez l'application pour afficher les modifications",
"zoom-factor":"Facteur de zoom"
},
@@ -1730,7 +1733,8 @@
"geo-map":{
"create-child-note-title":"Créer une nouvelle note enfant et l'ajouter à la carte",
"create-child-note-instruction":"Cliquez sur la carte pour créer une nouvelle note à cet endroit ou appuyez sur Échap pour la supprimer.",
"unable-to-load-map":"Impossible de charger la carte."
"unable-to-load-map":"Impossible de charger la carte.",
"create-child-note-text":"Ajouter le marqueur"
},
"geo-map-context":{
"open-location":"Ouvrir la position",
@@ -1835,12 +1839,13 @@
"book_properties_config":{
"hide-weekends":"Masquer les week-ends",
"display-week-numbers":"Afficher les numéros de semaine",
"add-column-placeholder":"Entrez le nom de la colonne...",
"edit-note-title":"Cliquez pour modifier le titre de la note",
"edit-column-title":"Cliquez pour modifier le titre de la colonne",
"column-already-exists":"Cette colonne existe déjà dans le tableau."
"column-already-exists":"Cette colonne existe déjà sur le tableau."
},
"presentation_view":{
"edit-slide":"Modifier cette diapositive",
@@ -1891,22 +1896,30 @@
"next_theme_message":"Vous utilisez actuellement le thème hérité de l'ancienne version, souhaitez-vous essayer le nouveau thème?",
"next_theme_button":"Essayez le nouveau thème",
"background_effects_title":"Les effets d'arrière-plan sont désormais stables",
"background_effects_message":"Sur les appareils Windows, les effets d'arrière-plan sont désormais parfaitement stables. Ils ajoutent une touche de couleur à l'interface utilisateur en floutant l'arrière-plan. Cette technique est également utilisée dans d'autres applications comme l'Explorateur Windows.",
"background_effects_message":"Sur les appareils Windows et macOS les effets d'arrière-plan sont désormais stables. Ils ajoutent une touche de couleur à l'interface utilisateur en floutant l'arrière-plan.",
"background_effects_button":"Activer les effets d'arrière-plan",
"dismiss":"Rejeter"
"dismiss":"Rejeter",
"new_layout_title":"Nouvelle mise en page",
"new_layout_message":"Nous avons introduit une mise en page modernisée pour Trilium. Le ruban a été supprimé et intégré de manière transparente dans l'interface principale, avec une nouvelle barre d'état et des sections extensibles (telles que les attributs promus) reprenant les fonctions clés.\n\nLa nouvelle mise en page est activée par défaut et peut être temporairement désactivée via Options → Apparence.",
"new_layout_button":"Plus d'infos"
},
"settings":{
"related_settings":"Paramètres associés"
},
"settings_appearance":{
"related_code_blocks":"Schéma de coloration syntaxique pour les blocs de code dans les notes de texte",
"related_code_notes":"Schéma de couleurs pour les notes de code"
"related_code_notes":"Schéma de couleurs pour les notes de code",
"ui":"Interface utilisateur",
"ui_old_layout":"Ancienne mise en page",
"ui_new_layout":"Nouvelle mise en page"
},
"units":{
"percentage":"%"
},
"pagination":{
"total_notes":"{{count}} notes"
"total_notes":"{{count}} notes",
"prev_page":"Page précédente",
"next_page":"Page suivante"
},
"collections":{
"rendering_error":"Impossible d'afficher le contenu en raison d'une erreur."
@@ -1925,8 +1938,9 @@
"unknown_widget":"Widget inconnu pour « {{id}} »."
},
"note_language":{
"not_set":"Non défini",
"configure-languages":"Configurer les langues..."
"not_set":"Langage non défini",
"configure-languages":"Configurer les langues...",
"help-on-languages":"Aide sur les langues de contenu..."
},
"content_language":{
"title":"Contenu des langues",
@@ -1974,14 +1988,288 @@
"title":"Options expérimentales",
"disclaimer":"Ces options sont expérimentales et peuvent provoquer une instabilité. Utilisez avec prudence.",
"new_layout_name":"Nouvelle mise en page",
"new_layout_description":"Essayez la nouvelle mise en page pour un look plus moderne et un usage améliorée. Sous réserve de changements importants dans les prochaines versions."
"new_layout_description":"Essayez la nouvelle mise en page pour un look plus moderne et un usage améliorée. Sous réserve de changements importants dans les prochaines versions.",
"llm_name":"AI / LLM Chat",
"llm_description":"Activer la barre de chat AI et les notes de chat LLM alimentées par de grands modèles de langage."
},
"read-only-info":{
"read-only-note":"Vous consultez actuellement une note en lecture seule.",
"auto-read-only-note":"Cette note s'affiche en mode lecture seule pour un chargement plus rapide.",
"edit-note":"Editer la note"
"edit-note":"Modifier la note"
},
"calendar_view":{
"delete_note":"Effacer la note..."
"delete_note":"Supprimer la note..."
},
"media":{
"play":"Lire (Espace)",
"pause":"Pause (Espace)",
"back-10s":"Retour arrière 10s (flèche gauche)",
"forward-30s":"Avance 30s",
"mute":"Silence (M)",
"unmute":"Réactiver le son (M)",
"playback-speed":"Vitesse de lecture",
"loop":"Boucle",
"disable-loop":"Désactiver la boucle",
"rotate":"Rotation",
"picture-in-picture":"Image dans l'image",
"exit-picture-in-picture":"Sortir de Image dans l'image",
"fullscreen":"Plein-écran (F)",
"exit-fullscreen":"Sortir du mode plein-écran",
"unsupported-format":"L'aperçu multimédia n'est pas disponible pour ce format de fichier:\n{{mime}}",
"zoom-to-fit":"Zoom pour remplir",
"zoom-reset":"Annuler zoom pour remplir"
},
"render":{
"setup_title":"Afficher du HTML personnalisé ou Preact JSX dans cette note",
"setup_create_sample_preact":"Créer un exemple de note avec Preact",
"setup_create_sample_html":"Créer un exemple de note avec HTML",
"setup_sample_created":"Un exemple de note a été créé en tant que note enfant.",
"disabled_description":"Ces notes de rendu proviennent d'une source externe. Pour vous protéger de contenu malveillant, elle n'est pas activée par défaut. Assurez-vous de faire confiance à la source avant de l’activer.",
"disabled_button_enable":"Activer la note de rendu"
},
"web_view_setup":{
"title":"Créez la vue de la page Web directement dans Trilium",
"url_placeholder":"Entrez ou collez l'adresse du site Web, par exemple https://triliumnotes.org",
"create_button":"Créer une vue Web",
"invalid_url_title":"Adresse invalide",
"invalid_url_message":"Insérer une adresse Web valide, par exemple https://triliumnotes.org.",
"disabled_description":"Cette vue Web a été importée à partir d'une source externe. Pour vous protéger du phishing ou du contenu malveillant, elle ne se charge pas automatiquement. Vous pouvez l'activer si vous faites confiance à la source.",
"disabled_button_enable":"Activer la vue Web"
},
"llm_chat":{
"placeholder":"Tapez un message...",
"send":"Envoyer",
"sending":"Envoi...",
"empty_state":"Démarrez une conversation en tapant un message ci-dessous.",
"note_context_enabled":"Cliquez pour désactiver le contexte de la note: {{title}}",
"note_context_disabled":"Cliquez pour inclure la note actuelle dans le contexte",
"no_provider_message":"Aucun fournisseur d'IA configuré. Ajoutez en un pour commencer à discuter.",
"add_provider":"Ajouter un fournisseur d'IA"
},
"sidebar_chat":{
"title":"discussion IA",
"launcher_title":"Ouvrir la discussion IA",
"new_chat":"Démarrer une nouvelle discussion",
"save_chat":"Enregistrer la discussion dans les notes",
"empty_state":"Démarrer une conversation",
"history":"Historique des discussions",
"recent_chats":"Discussions récentes",
"no_chats":"Pas de discussions précédentes"
},
"note-color":{
"clear-color":"Retirer la couleur de la note",
"set-color":"Définir la couleur de la note",
"set-custom-color":"Définir la couleur personnalisée de la note"
},
"popup-editor":{
"maximize":"Basculer sur l'éditeur complet"
},
"server":{
"unknown_http_error_title":"Erreur de communication avec le serveur",
"unknown_http_error_content":"Code de statut: {{statusCode}}\nURL: {{method}} {{url}}\nMessage: {{message}}",
"traefik_blocks_requests":"Si vous utilisez le reverse proxy Traefik, celui-ci a introduit un changement de rupture qui affecte la communication avec le serveur."
},
"tab_history_navigation_buttons":{
"go-back":"Revenir à la note précédente",
"go-forward":"Aller vers la note suivante"
},
"breadcrumb":{
"hoisted_badge":"Remonté",
"hoisted_badge_title":"Redescendu",
"workspace_badge":"Espace de travail",
"scroll_to_top_title":"Aller au début de la note",
"create_new_note":"Créer une nouvelle note enfant",
"empty_hide_archived_notes":"Cacher les notes archivées"
},
"breadcrumb_badges":{
"read_only_explicit":"Lecture seule",
"read_only_explicit_description":"Cette note a été paramétrée manuellement en lecture seule.\nCliquer pour temporairement l'éditer.",
"read_only_auto":"Lecture seule automatique",
"read_only_auto_description":"Cette note a été réglée automatiquement en mode lecture seule pour des raisons de performances. Cette limite automatique est réglable à partir des paramètres.\n\nCliquez pour la modifier temporairement.",
"read_only_temporarily_disabled_description":"Cette note est actuellement modifiable, mais elle est normalement en lecture seule. La note redeviendra en lecture seule dès que vous accéderez à une autre note.\n\nCliquez pour réactiver le mode lecture seule.",
"shared_publicly":"Partagés publiquement",
"shared_locally":"Partagé localement",
"shared_copy_to_clipboard":"Copier le lien vers le presse-papier",
"shared_open_in_browser":"Ouvrir le lien dans le navigateur",
"shared_unshare":"Supprimer le partage",
"clipped_note":"Clip Web",
"clipped_note_description":"Cette note a été initialement construite depuis l'url {{url}}.\n\nCliquez pour accéder à la page Web source.",
"execute_script":"Exécuter le script",
"execute_script_description":"Cette note est une note de script. Cliquez pour exécuter le script.",
"execute_sql":"Exécuter la commande SQL",
"execute_sql_description":"Cette note est une note SQL. Cliquer pour exécuter la requête SQL.",
"save_status_saved":"Enregister",
"save_status_saving":"Enregistrement...",
"save_status_unsaved":"Non sauvée",
"save_status_error":"La sauvegarde a échoué",
"save_status_saving_tooltip":"Les modifications sont enregistrées.",
"save_status_unsaved_tooltip":"Il y a des changements non enregistrés. Ils seront enregistrés automatiquement dans un instant.",
"save_status_error_tooltip":"Une erreur s'est produite lors de l'enregistrement de la note. Si possible, essayez de copier le contenu de la note ailleurs et de recharger l'application."
},
"right_pane":{
"toggle":"Basculer le panneau de droite",
"custom_widget_go_to_source":"Aller sur le code source",
"empty_message":"Rien à afficher pour cette note",
"empty_button":"Cacher le panneau"
},
"pdf":{
"attachments_one":"{{count}} pièce jointe",
"attachments_many":"{{count}} pièces jointes",
"attachments_other":"{{count}} pièces jointes",
"layers_one":"{{count}} couche",
"layers_many":"{{count}} couches",
"layers_other":"{{count}} couches",
"pages_one":"{{count}} page",
"pages_many":"{{count}} pages",
"pages_other":"{{count}} pages",
"pages_alt":"Page {{pageNumber}}",
"pages_loading":"Chargement..."
},
"platform_indicator":{
"available_on":"Disponible sur {{platform}}"
},
"mobile_tab_switcher":{
"title_one":"{{count}} onglet",
"title_many":"{{count}} onglets",
"title_other":"{{count}} onglets",
"more_options":"Autres options"
},
"bookmark_buttons":{
"bookmarks":"Signets"
},
"active_content_badges":{
"type_icon_pack":"pack d'icônes",
"type_backend_script":"Script backend",
"type_frontend_script":"Script frontend",
"type_widget":"Widget",
"type_app_css":"CSS personnalisé",
"type_render_note":"Note de rendu",
"type_web_view":"Vue Web",
"type_app_theme":"Thème personnalisé",
"toggle_tooltip_enable_tooltip":"Cliquer pour activer {{type}}.",
"toggle_tooltip_disable_tooltip":"Cliquer pour désactiver ce {{type}}.",
"menu_docs":"Ouvrir la documentation",
"menu_execute_now":"Exécuter le script maintenant",
"menu_run":"Démarrer automatiquement",
"menu_run_disabled":"Manuellement",
"menu_run_backend_startup":"Lorsque le backend commence",
"menu_run_hourly":"Horaire",
"menu_run_daily":"Quotidien",
"menu_run_frontend_startup":"Lorsque le frontend du bureau démarre",
"menu_run_mobile_startup":"Lorsque le frontend mobile démarre",
"menu_change_to_widget":"Passer au widget",
"menu_change_to_frontend_script":"Passer au script frontend",
"menu_theme_base":"Thème de base"
},
"setup_form":{
"more_info":"En savoir plus"
},
"mermaid":{
"placeholder":"Tapez le contenu de votre diagramme Mermaid ou utilisez l'un des diagrammes de l'échantillon ci-dessous.",
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.