diff --git a/.env b/.env
new file mode 100644
index 000000000..ff859e622
--- /dev/null
+++ b/.env
@@ -0,0 +1 @@
+NODE_OPTIONS=--max_old_space_size=4096
\ No newline at end of file
diff --git a/.github/actions/build-electron/action.yml b/.github/actions/build-electron/action.yml
index 9e5b1670b..93772d7d9 100644
--- a/.github/actions/build-electron/action.yml
+++ b/.github/actions/build-electron/action.yml
@@ -85,7 +85,7 @@ runs:
APPLE_ID: ${{ env.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ env.APPLE_ID_PASSWORD }}
WINDOWS_SIGN_EXECUTABLE: ${{ env.WINDOWS_SIGN_EXECUTABLE }}
- TRILIUM_ARTIFACT_NAME_HINT: TriliumNextNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}
+ TRILIUM_ARTIFACT_NAME_HINT: TriliumNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}
run: pnpm nx --project=desktop electron-forge:make -- --arch=${{ inputs.arch }} --platform=${{ inputs.forge_platform }}
# Add DMG signing step
diff --git a/.github/actions/build-server/action.yml b/.github/actions/build-server/action.yml
index c3c6288bc..b0ab05212 100644
--- a/.github/actions/build-server/action.yml
+++ b/.github/actions/build-server/action.yml
@@ -30,4 +30,4 @@ runs:
mkdir -p upload
file=$(find ./apps/server/out -name '*.tar.xz' -print -quit)
name=${{ github.ref_name }}
- cp "$file" "upload/TriliumNextNotes-Server-${name//\//-}-${{ inputs.os }}-${{ inputs.arch }}.tar.xz"
+ cp "$file" "upload/TriliumNotes-Server-${name//\//-}-${{ inputs.os }}-${{ inputs.arch }}.tar.xz"
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 25cd18724..3a241d807 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -13,9 +13,9 @@ name: "CodeQL Advanced"
on:
push:
- branches: [ "develop" ]
+ branches: [ "main" ]
pull_request:
- branches: [ "develop" ]
+ branches: [ "main" ]
schedule:
- cron: '20 7 * * 0'
diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml
index d15752461..e9d3964c6 100644
--- a/.github/workflows/dev.yml
+++ b/.github/workflows/dev.yml
@@ -1,9 +1,9 @@
name: Dev
on:
push:
- branches: [ develop ]
+ branches: [ main ]
pull_request:
- branches: [ develop ]
+ branches: [ main ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
@@ -12,8 +12,8 @@ concurrency:
env:
GHCR_REGISTRY: ghcr.io
DOCKERHUB_REGISTRY: docker.io
- IMAGE_NAME: ${{ github.repository_owner }}/notes
- TEST_TAG: ${{ github.repository_owner }}/notes:test
+ IMAGE_NAME: ${{ github.repository}}
+ TEST_TAG: ${{ github.repository}}:test
permissions:
pull-requests: write # for PR comments
@@ -77,6 +77,7 @@ jobs:
- name: Trigger client build
run: pnpm nx run client:build
- name: Send client bundle stats to RelativeCI
+ if: false
uses: relative-ci/agent-action@v3
with:
webpackStatsFile: ./apps/client/dist/webpack-stats.json
diff --git a/.github/workflows/main-docker.yml b/.github/workflows/main-docker.yml
index e59ddc318..40c5149c7 100644
--- a/.github/workflows/main-docker.yml
+++ b/.github/workflows/main-docker.yml
@@ -1,7 +1,7 @@
on:
push:
branches:
- - "develop"
+ - "main"
- "feature/update**"
- "feature/server_esm**"
paths-ignore:
@@ -14,8 +14,8 @@ on:
env:
GHCR_REGISTRY: ghcr.io
DOCKERHUB_REGISTRY: docker.io
- IMAGE_NAME: ${{ github.repository_owner }}/notes
- TEST_TAG: ${{ github.repository_owner }}/notes:test
+ IMAGE_NAME: ${{ github.repository}}
+ TEST_TAG: ${{ github.repository}}:test
permissions:
contents: read
@@ -83,6 +83,14 @@ jobs:
- name: Run Playwright tests
run: TRILIUM_DOCKER=1 TRILIUM_PORT=8082 pnpm exec nx run server-e2e:e2e
+
+ - name: Upload Playwright trace
+ if: failure()
+ uses: actions/upload-artifact@v4
+ with:
+ name: Playwright trace (${{ matrix.dockerfile }})
+ path: test-output/playwright/output
+
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index 1f370c360..990c8dfb9 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -92,7 +92,7 @@ jobs:
uses: actions/upload-artifact@v4
if: ${{ github.event_name == 'pull_request' }}
with:
- name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }}
+ name: TriliumNotes ${{ matrix.os.name }} ${{ matrix.arch }}
path: apps/desktop/upload
nightly-server:
diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml
index 8ea06d74b..3749f1efd 100644
--- a/.github/workflows/playwright.yml
+++ b/.github/workflows/playwright.yml
@@ -3,7 +3,7 @@ name: playwright
on:
push:
branches:
- - master
+ - main
pull_request:
permissions:
@@ -40,4 +40,4 @@ jobs:
# - run: npx nx-cloud record -- echo Hello World
# Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected
# When you enable task distribution, run the e2e-ci task instead of e2e
- - run: pnpm exec nx affected -t e2e
+ - run: pnpm exec nx affected -t e2e --exclude desktop-e2e
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 9533621f0..1d8dcd453 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -23,7 +23,7 @@ jobs:
shell: bash
forge_platform: darwin
- name: linux
- image: ubuntu-latest
+ image: ubuntu-22.04
shell: bash
forge_platform: linux
- name: windows
diff --git a/.nvmrc b/.nvmrc
index 156ca6d39..fcc226927 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-22.16.0
\ No newline at end of file
+22.17.0
\ No newline at end of file
diff --git a/README.md b/README.md
index 288bc3467..11391c89e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# TriliumNext Notes
+# Trilium Notes


@@ -7,7 +7,7 @@
[English](./README.md) | [Chinese](./docs/README-ZH_CN.md) | [Russian](./docs/README.ru.md) | [Japanese](./docs/README.ja.md) | [Italian](./docs/README.it.md) | [Spanish](./docs/README.es.md)
-TriliumNext Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
+Trilium Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for quick overview:
@@ -153,7 +153,7 @@ Please view the [documentation guide](./docs/Developer%20Guide/Developer%20Guide
## 👏 Shoutouts
* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - best WYSIWYG editor on the market, very interactive and listening team
-* [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. TriliumNext Notes would not be the same without it.
+* [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. Trilium Notes would not be the same without it.
* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages
* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library without competition. Used in [relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map)
diff --git a/_regroup/bin/release-flatpack.sh b/_regroup/bin/release-flatpack.sh
index f28ff7adb..31e42881b 100644
--- a/_regroup/bin/release-flatpack.sh
+++ b/_regroup/bin/release-flatpack.sh
@@ -24,7 +24,7 @@ if ! git diff-index --quiet HEAD --; then
exit 1
fi
-BASE_BRANCH=master
+BASE_BRANCH=main
if [[ "$VERSION" == *"beta"* ]]; then
BASE_BRANCH=beta
diff --git a/_regroup/bin/release.sh b/_regroup/bin/release.sh
index db3c62e4b..fe9a65a36 100644
--- a/_regroup/bin/release.sh
+++ b/_regroup/bin/release.sh
@@ -47,11 +47,3 @@ echo "Tagging commit with $TAG"
git tag $TAG
git push origin $TAG
-
-echo "Updating master"
-
-git fetch
-git checkout master
-git reset --hard origin/master
-git merge origin/develop
-git push
\ No newline at end of file
diff --git a/_regroup/bin/translation.sh b/_regroup/bin/translation.sh
index 4375303b9..15d211ea7 100644
--- a/_regroup/bin/translation.sh
+++ b/_regroup/bin/translation.sh
@@ -25,15 +25,16 @@ stats() {
# Print the number of existing strings on the JSON files for each locale
s=$(number_of_keys "${paths[0]}/en/server.json")
c=$(number_of_keys "${paths[1]}/en/translation.json")
- echo "| locale |server strings |client strings |"
- echo "|--------|---------------|---------------|"
- echo "| en | ${s} | ${c} |"
+ echo "| locale | server strings | client strings |"
+ echo "|--------|----------------|----------------|"
+ echo "| en | ${s} | ${c} |"
+ echo "|--------|----------------|----------------|"
for locale in "${locales[@]}"; do
s=$(number_of_keys "${paths[0]}/${locale}/server.json")
c=$(number_of_keys "${paths[1]}/${locale}/translation.json")
n1=$(((8 - ${#locale}) / 2))
n2=$((n1 == 1 ? n1 + 1 : n1))
- echo "|$(printf "%${n1}s")${locale}$(printf "%${n2}s")| ${s} | ${c} |"
+ echo "|$(printf "%${n1}s")${locale}$(printf "%${n2}s")| ${s} | ${c} |"
done
}
@@ -78,7 +79,10 @@ file_path="$(
cd -- "$(dirname "${0}")" >/dev/null 2>&1 || exit
pwd -P
)"
-paths=("${file_path}/../translations/" "${file_path}/../src/public/translations/")
+paths=(
+ "${file_path}/../../apps/server/src/assets/translations/"
+ "${file_path}/../../apps/client/src/translations/"
+)
locales=(cn de es fr pt_br ro tw)
if [ $# -eq 1 ]; then
diff --git a/_regroup/package.json b/_regroup/package.json
index 6f86b5d12..b9e974e1b 100644
--- a/_regroup/package.json
+++ b/_regroup/package.json
@@ -36,9 +36,9 @@
},
"devDependencies": {
"@playwright/test": "1.53.1",
- "@stylistic/eslint-plugin": "4.4.1",
+ "@stylistic/eslint-plugin": "5.0.0",
"@types/express": "5.0.3",
- "@types/node": "22.15.32",
+ "@types/node": "22.15.33",
"@types/yargs": "17.0.33",
"@vitest/coverage-v8": "3.2.4",
"eslint": "9.29.0",
diff --git a/apps/client/package.json b/apps/client/package.json
index b6860498d..b1515f0c6 100644
--- a/apps/client/package.json
+++ b/apps/client/package.json
@@ -5,7 +5,7 @@
"private": true,
"license": "AGPL-3.0-only",
"author": {
- "name": "TriliumNext Notes Team",
+ "name": "Trilium Notes Team",
"email": "contact@eliandoran.me",
"url": "https://github.com/TriliumNext/Notes"
},
@@ -18,7 +18,7 @@
"@fullcalendar/list": "6.1.17",
"@fullcalendar/multimonth": "6.1.17",
"@fullcalendar/timegrid": "6.1.17",
- "@mermaid-js/layout-elk": "0.1.7",
+ "@mermaid-js/layout-elk": "0.1.8",
"@mind-elixir/node-menu": "1.0.5",
"@popperjs/core": "2.11.8",
"@triliumnext/ckeditor5": "workspace:*",
@@ -47,7 +47,7 @@
"leaflet-gpx": "2.2.0",
"mark.js": "8.11.1",
"marked": "15.0.12",
- "mermaid": "11.6.0",
+ "mermaid": "11.7.0",
"mind-elixir": "4.6.1",
"normalize.css": "8.0.1",
"panzoom": "9.4.3",
@@ -60,13 +60,13 @@
"@ckeditor/ckeditor5-inspector": "4.1.0",
"@types/bootstrap": "5.2.10",
"@types/jquery": "3.5.32",
- "@types/leaflet": "1.9.18",
+ "@types/leaflet": "1.9.19",
"@types/leaflet-gpx": "1.3.7",
"@types/mark.js": "8.11.12",
"copy-webpack-plugin": "13.0.0",
"happy-dom": "18.0.1",
"script-loader": "0.7.2",
- "vite-plugin-static-copy": "3.0.2"
+ "vite-plugin-static-copy": "3.1.0"
},
"nx": {
"name": "client",
diff --git a/apps/client/src/components/tab_manager.ts b/apps/client/src/components/tab_manager.ts
index fa83470ce..0416071c6 100644
--- a/apps/client/src/components/tab_manager.ts
+++ b/apps/client/src/components/tab_manager.ts
@@ -688,7 +688,7 @@ export default class TabManager extends Component {
const titleFragments = [
// it helps to navigate in history if note title is included in the title
await activeNoteContext.getNavigationTitle(),
- "TriliumNext Notes"
+ "Trilium Notes"
].filter(Boolean);
document.title = titleFragments.join(" - ");
diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json
index cf852e56b..ccc04e21b 100644
--- a/apps/client/src/translations/cn/translation.json
+++ b/apps/client/src/translations/cn/translation.json
@@ -1,6 +1,6 @@
{
"about": {
- "title": "关于 TriliumNext Notes",
+ "title": "关于 Trilium Notes",
"close": "关闭",
"homepage": "项目主页:",
"app_version": "应用版本:",
diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json
index ea17f0575..694e7934f 100644
--- a/apps/client/src/translations/de/translation.json
+++ b/apps/client/src/translations/de/translation.json
@@ -1,6 +1,6 @@
{
"about": {
- "title": "Über TriliumNext Notes",
+ "title": "Über Trilium Notes",
"close": "Schließen",
"homepage": "Startseite:",
"app_version": "App-Version:",
@@ -639,7 +639,7 @@
"reload_frontend": "Frontend neu laden",
"show_hidden_subtree": "Versteckten Teilbaum anzeigen",
"show_help": "Hilfe anzeigen",
- "about": "Über TriliumNext Notes",
+ "about": "Über Trilium Notes",
"logout": "Abmelden",
"show-cheatsheet": "Cheatsheet anzeigen",
"toggle-zen-mode": "Zen Modus"
diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json
index 251819807..e3ae657b7 100644
--- a/apps/client/src/translations/en/translation.json
+++ b/apps/client/src/translations/en/translation.json
@@ -1,6 +1,6 @@
{
"about": {
- "title": "About TriliumNext Notes",
+ "title": "About Trilium Notes",
"close": "Close",
"homepage": "Homepage:",
"app_version": "App version:",
@@ -643,7 +643,7 @@
"reload_frontend": "Reload Frontend",
"show_hidden_subtree": "Show Hidden Subtree",
"show_help": "Show Help",
- "about": "About TriliumNext Notes",
+ "about": "About Trilium Notes",
"logout": "Logout",
"show-cheatsheet": "Show Cheatsheet",
"toggle-zen-mode": "Zen Mode"
@@ -1197,7 +1197,6 @@
"restore_provider": "Restore provider to search",
"similarity_threshold": "Similarity Threshold",
"similarity_threshold_description": "Minimum similarity score (0-1) for notes to be included in context for LLM queries",
-
"reprocess_index": "Rebuild Search Index",
"reprocessing_index": "Rebuilding...",
"reprocess_index_started": "Search index optimization started in the background",
@@ -1929,5 +1928,10 @@
"download_link": "Download Native Version",
"continue_anyway": "Continue Anyway",
"dont_show_again": "Don't show this warning again"
+ },
+ "editorfeatures": {
+ "title": "Features",
+ "emoji_completion_enabled": "Enable Emoji auto-completion",
+ "note_completion_enabled": "Enable note auto-completion"
}
}
diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json
index 64951c3a6..45d1a6115 100644
--- a/apps/client/src/translations/es/translation.json
+++ b/apps/client/src/translations/es/translation.json
@@ -1,6 +1,6 @@
{
"about": {
- "title": "Acerca de TriliumNext Notes",
+ "title": "Acerca de Trilium Notes",
"close": "Cerrar",
"homepage": "Página principal:",
"app_version": "Versión de la aplicación:",
@@ -16,7 +16,7 @@
"message": "Ha ocurrido un error crítico que previene que el cliente de la aplicación inicie:\n\n{{message}}\n\nMuy probablemente es causado por un script que falla de forma inesperada. Intente iniciar la aplicación en modo seguro y atienda el error."
},
"widget-error": {
- "title": "No se pudo inicializar un widget",
+ "title": "Hubo un fallo al inicializar un widget",
"message-custom": "El widget personalizado de la nota con ID \"{{id}}\", titulada \"{{title}}\" no pudo ser inicializado debido a:\n\n{{message}}",
"message-unknown": "Un widget no pudo ser inicializado debido a:\n\n{{message}}"
},
@@ -127,6 +127,7 @@
"collapseSubTree": "colapsar subárbol",
"tabShortcuts": "Atajos de pestañas",
"newTabNoteLink": "CTRL+clic - (o clic central del mouse) en el enlace de la nota abre la nota en una nueva pestaña",
+ "newTabWithActivationNoteLink": "Ctrl+Shift+clic - (o Shift+clic de rueda de ratón) en el enlace de la nota abre y activa la nota en una nueva pestaña",
"onlyInDesktop": "Solo en escritorio (compilación con Electron)",
"openEmptyTab": "abrir pestaña vacía",
"closeActiveTab": "cerrar pestaña activa",
@@ -232,6 +233,8 @@
"move_success_message": "Las notas seleccionadas se han movido a "
},
"note_type_chooser": {
+ "change_path_prompt": "Cambiar donde se creará la nueva nota:",
+ "search_placeholder": "ruta de búsqueda por nombre (por defecto si está vacío)",
"modal_title": "Elija el tipo de nota",
"close": "Cerrar",
"modal_body": "Elija el tipo de nota/plantilla de la nueva nota:",
@@ -274,9 +277,9 @@
"revision_last_edited": "Esta revisión se editó por última vez en {{date}}",
"confirm_delete_all": "¿Quiere eliminar todas las revisiones de esta nota?",
"no_revisions": "Aún no hay revisiones para esta nota...",
- "restore_button": "",
+ "restore_button": "Restaurar",
"confirm_restore": "¿Quiere restaurar esta revisión? Esto sobrescribirá el título actual y el contenido de la nota con esta revisión.",
- "delete_button": "",
+ "delete_button": "Eliminar",
"confirm_delete": "¿Quieres eliminar esta revisión?",
"revisions_deleted": "Se han eliminado las revisiones de nota.",
"revision_restored": "Se ha restaurado la revisión de nota.",
@@ -588,6 +591,7 @@
"sat": "Sáb",
"sun": "Dom",
"cannot_find_day_note": "No se puede encontrar la nota del día",
+ "cannot_find_week_note": "No se puede encontrar la nota de la semana",
"january": "Enero",
"febuary": "Febrero",
"march": "Marzo",
@@ -639,7 +643,7 @@
"reload_frontend": "Recargar interfaz",
"show_hidden_subtree": "Mostrar subárbol oculto",
"show_help": "Mostrar ayuda",
- "about": "Acerca de TriliumNext Notes",
+ "about": "Acerca de Trilium Notes",
"logout": "Cerrar sesión",
"show-cheatsheet": "Mostrar hoja de trucos",
"toggle-zen-mode": "Modo Zen"
@@ -1121,6 +1125,148 @@
"layout-vertical-description": "la barra del lanzador está en la izquierda (por defecto)",
"layout-horizontal-description": "la barra de lanzamiento está debajo de la barra de pestañas, la barra de pestañas ahora tiene ancho completo."
},
+ "ai_llm": {
+ "not_started": "No iniciado",
+ "title": "IA y ajustes de embeddings",
+ "processed_notes": "Notas procesadas",
+ "total_notes": "Notas totales",
+ "progress": "Progreso",
+ "queued_notes": "Notas en fila",
+ "failed_notes": "Notas fallidas",
+ "last_processed": "Última procesada",
+ "refresh_stats": "Recargar estadísticas",
+ "enable_ai_features": "Habilitar características IA/LLM",
+ "enable_ai_description": "Habilitar características de IA como resumen de notas, generación de contenido y otras capacidades LLM",
+ "openai_tab": "OpenAI",
+ "anthropic_tab": "Anthropic",
+ "voyage_tab": "Voyage AI",
+ "ollama_tab": "Ollama",
+ "enable_ai": "Habilitar características IA/LLM",
+ "enable_ai_desc": "Habilitar características de IA como resumen de notas, generación de contenido y otras capacidades LLM",
+ "provider_configuration": "Configuración de proveedor de IA",
+ "provider_precedence": "Precedencia de proveedor",
+ "provider_precedence_description": "Lista de proveedores en orden de precedencia separada por comas (p.e., 'openai,anthropic,ollama')",
+ "temperature": "Temperatura",
+ "temperature_description": "Controla la aleatoriedad de las respuestas (0 = determinista, 2 = aleatoriedad máxima)",
+ "system_prompt": "Mensaje de sistema",
+ "system_prompt_description": "Mensaje de sistema predeterminado utilizado para todas las interacciones de IA",
+ "openai_configuration": "Configuración de OpenAI",
+ "openai_settings": "Ajustes de OpenAI",
+ "api_key": "Clave API",
+ "url": "URL base",
+ "model": "Modelo",
+ "openai_api_key_description": "Tu clave API de OpenAI para acceder a sus servicios de IA",
+ "anthropic_api_key_description": "Tu clave API de Anthropic para acceder a los modelos Claude",
+ "default_model": "Modelo por defecto",
+ "openai_model_description": "Ejemplos: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
+ "base_url": "URL base",
+ "openai_url_description": "Por defecto: https://api.openai.com/v1",
+ "anthropic_settings": "Ajustes de Anthropic",
+ "anthropic_url_description": "URL base para la API de Anthropic (por defecto: https://api.anthropic.com)",
+ "anthropic_model_description": "Modelos Claude de Anthropic para el completado de chat",
+ "voyage_settings": "Ajustes de Voyage AI",
+ "ollama_settings": "Ajustes de Ollama",
+ "ollama_url_description": "URL para la API de Ollama (por defecto: http://localhost:11434)",
+ "ollama_model_description": "Modelo de Ollama a usar para el completado de chat",
+ "anthropic_configuration": "Configuración de Anthropic",
+ "voyage_configuration": "Configuración de Voyage AI",
+ "voyage_url_description": "Por defecto: https://api.voyageai.com/v1",
+ "ollama_configuration": "Configuración de Ollama",
+ "enable_ollama": "Habilitar Ollama",
+ "enable_ollama_description": "Habilitar Ollama para uso de modelo de IA local",
+ "ollama_url": "URL de Ollama",
+ "ollama_model": "Modelo de Ollama",
+ "refresh_models": "Refrescar modelos",
+ "refreshing_models": "Refrescando...",
+ "enable_automatic_indexing": "Habilitar indexado automático",
+ "rebuild_index": "Recrear índice",
+ "rebuild_index_error": "Error al comenzar la reconstrucción del índice. Consulte los registros para más detalles.",
+ "note_title": "Título de nota",
+ "error": "Error",
+ "last_attempt": "Último intento",
+ "actions": "Acciones",
+ "retry": "Reintentar",
+ "partial": "{{ percentage }}% completado",
+ "retry_queued": "Nota en la cola para reintento",
+ "retry_failed": "Hubo un fallo al poner en la cola a la nota para reintento",
+ "max_notes_per_llm_query": "Máximo de notas por consulta",
+ "max_notes_per_llm_query_description": "Número máximo de notas similares a incluir en el contexto IA",
+ "active_providers": "Proveedores activos",
+ "disabled_providers": "Proveedores deshabilitados",
+ "remove_provider": "Eliminar proveedor de la búsqueda",
+ "restore_provider": "Restaurar proveedor a la búsqueda",
+ "similarity_threshold": "Bias de similaridad",
+ "similarity_threshold_description": "Puntuación de similaridad mínima (0-1) para incluir notas en el contexto para consultas LLM",
+ "reprocess_index": "Reconstruir el índice de búsqueda",
+ "reprocessing_index": "Reconstruyendo...",
+ "reprocess_index_started": "La optimización de índice de búsqueda comenzó en segundo plano",
+ "reprocess_index_error": "Error al reconstruir el índice de búsqueda",
+ "index_rebuild_progress": "Progreso de reconstrucción de índice",
+ "index_rebuilding": "Optimizando índice ({{percentage}}%)",
+ "index_rebuild_complete": "Optimización de índice completa",
+ "index_rebuild_status_error": "Error al comprobar el estado de reconstrucción del índice",
+ "never": "Nunca",
+ "processing": "Procesando ({{percentage}}%)",
+ "incomplete": "Incompleto ({{percentage}}%)",
+ "complete": "Completo (100%)",
+ "refreshing": "Refrescando...",
+ "auto_refresh_notice": "Refrescar automáticamente cada {{seconds}} segundos",
+ "note_queued_for_retry": "Nota en la cola para reintento",
+ "failed_to_retry_note": "Hubo un fallo al reintentar nota",
+ "all_notes_queued_for_retry": "Todas las notas con fallo agregadas a la cola para reintento",
+ "failed_to_retry_all": "Hubo un fallo al reintentar notas",
+ "ai_settings": "Ajustes de IA",
+ "api_key_tooltip": "Clave API para acceder al servicio",
+ "empty_key_warning": {
+ "anthropic": "La clave API de Anthropic está vacía. Por favor, ingrese una clave API válida.",
+ "openai": "La clave API de OpenAI está vacía. Por favor, ingrese una clave API válida.",
+ "voyage": "La clave API de Voyage está vacía. Por favor, ingrese una clave API válida.",
+ "ollama": "La clave API de Ollama está vacía. Por favor, ingrese una clave API válida."
+ },
+ "agent": {
+ "processing": "Procesando...",
+ "thinking": "Pensando...",
+ "loading": "Cargando...",
+ "generating": "Generando..."
+ },
+ "name": "IA",
+ "openai": "OpenAI",
+ "use_enhanced_context": "Utilizar contexto mejorado",
+ "enhanced_context_description": "Provee a la IA con más contexto de la nota y sus notas relacionadas para obtener mejores respuestas",
+ "show_thinking": "Mostrar pensamiento",
+ "show_thinking_description": "Mostrar la cadena del proceso de pensamiento de la IA",
+ "enter_message": "Ingrese su mensaje...",
+ "error_contacting_provider": "Error al contactar con su proveedor de IA. Por favor compruebe sus ajustes y conexión a internet.",
+ "error_generating_response": "Error al generar respuesta de IA",
+ "index_all_notes": "Indexar todas las notas",
+ "index_status": "Estado de índice",
+ "indexed_notes": "Notas indexadas",
+ "indexing_stopped": "Indexado detenido",
+ "indexing_in_progress": "Indexado en progreso...",
+ "last_indexed": "Último indexado",
+ "n_notes_queued": "{{ count }} nota agregada a la cola para indexado",
+ "n_notes_queued_plural": "{{ count }} notas agregadas a la cola para indexado",
+ "note_chat": "Chat de nota",
+ "notes_indexed": "{{ count }} nota indexada",
+ "notes_indexed_plural": "{{ count }} notas indexadas",
+ "sources": "Fuentes",
+ "start_indexing": "Comenzar indexado",
+ "use_advanced_context": "Usar contexto avanzado",
+ "ollama_no_url": "Ollama no está configurado. Por favor ingrese una URL válida.",
+ "chat": {
+ "root_note_title": "Chats de IA",
+ "root_note_content": "Esta nota contiene tus conversaciones de chat de IA guardadas.",
+ "new_chat_title": "Nuevo chat",
+ "create_new_ai_chat": "Crear nuevo chat de IA"
+ },
+ "create_new_ai_chat": "Crear nuevo chat de IA",
+ "configuration_warnings": "Hay algunos problemas con su configuración de IA. Por favor compruebe sus ajustes.",
+ "experimental_warning": "La característica de LLM aún es experimental - ha sido advertido.",
+ "selected_provider": "Proveedor seleccionado",
+ "selected_provider_description": "Elija el proveedor de IA para el chat y características de completado",
+ "select_model": "Seleccionar modelo...",
+ "select_provider": "Seleccionar proveedor..."
+ },
"zoom_factor": {
"title": "Factor de zoom (solo versión de escritorio)",
"description": "El zoom también se puede controlar con los atajos CTRL+- y CTRL+=."
@@ -1236,12 +1382,26 @@
"label": "Tamaño para modo de solo lectura automático (notas de texto)",
"unit": "caracteres"
},
+ "custom_date_time_format": {
+ "title": "Formato de fecha/hora personalizada",
+ "description": "Personalizar el formado de fecha y la hora insertada vía o la barra de herramientas. Véa la documentación de Day.js para más tokens de formato disponibles.",
+ "format_string": "Cadena de formato:",
+ "formatted_time": "Fecha/hora personalizada:"
+ },
"i18n": {
"title": "Localización",
"language": "Idioma",
"first-day-of-the-week": "Primer día de la semana",
"sunday": "Domingo",
- "monday": "Lunes"
+ "monday": "Lunes",
+ "first-week-of-the-year": "Primer semana del año",
+ "first-week-contains-first-day": "Primer semana que contiene al primer día del año",
+ "first-week-contains-first-thursday": "Primer semana que contiene al primer jueves del año",
+ "first-week-has-minimum-days": "Primer semana que contiene un mínimo de días",
+ "min-days-in-first-week": "Días mínimos en la primer semana",
+ "first-week-info": "Primer semana que contiene al primer jueves del año está basado en el estándarISO 8601.",
+ "first-week-warning": "Cambiar las opciones de primer semana puede causar duplicados con las Notas Semanales existentes y las Notas Semanales existentes no serán actualizadas respectivamente.",
+ "formatting-locale": "Fecha y formato de número"
},
"backup": {
"automatic_backup": "Copia de seguridad automática",
@@ -1308,6 +1468,39 @@
"password_mismatch": "Las nuevas contraseñas no son las mismas.",
"password_changed_success": "La contraseña ha sido cambiada. Trilium se recargará después de presionar Aceptar."
},
+ "multi_factor_authentication": {
+ "title": "Autenticación Multi-Factor",
+ "description": "La autenticación multifactor (MFA) agrega una capa adicional de seguridad a su cuenta. En lugar de solo ingresar una contraseña para iniciar sesión, MFA requiere que proporcione una o más pruebas adicionales para verificar su identidad. De esta manera, incluso si alguien se apodera de su contraseña, aún no puede acceder a su cuenta sin la segunda pieza de información. Es como agregar una cerradura adicional a su puerta, lo que hace que sea mucho más difícil para cualquier otra persona entrar.
Por favor siga las instrucciones a continuación para habilitar MFA. Si no lo configura correctamente, el inicio de sesión volverá a solo contraseña.",
+ "mfa_enabled": "Habilitar la autenticación multifactor",
+ "mfa_method": "Método MFA",
+ "electron_disabled": "Actualmente la autenticación multifactor no está soportada en la compilación de escritorio.",
+ "totp_title": "Contraseña de un solo uso basada en el tiempo (TOTP)",
+ "totp_description": "TOTP (contraseña de un solo uso basada en el tiempo) es una característica de seguridad que genera un código temporal único que cambia cada 30 segundos. Utiliza este código, junto con su contraseña para iniciar sesión en su cuenta, lo que hace que sea mucho más difícil para cualquier otra persona acceder a ella.",
+ "totp_secret_title": "Generar secreto TOTP",
+ "totp_secret_generate": "Generar secreto TOTP",
+ "totp_secret_regenerate": "Regenerar secreto TOTP",
+ "no_totp_secret_warning": "Para habilitar TOTP, primero debe de generar un secreto TOTP.",
+ "totp_secret_description_warning": "Después de generar un nuevo secreto TOTP, le será requerido que inicie sesión otra vez con el nuevo secreto TOTP.",
+ "totp_secret_generated": "Secreto TOTP generado",
+ "totp_secret_warning": "Por favor guarde el secreto generado en una ubicación segura. No será mostrado de nuevo.",
+ "totp_secret_regenerate_confirm": "¿Está seguro que desea regenerar el secreto TOTP? Esto va a invalidar el secreto TOTP previo y todos los códigos de recuperación existentes.",
+ "recovery_keys_title": "Claves de recuperación para un solo inicio de sesión",
+ "recovery_keys_description": "Las claves de recuperación para un solo inicio de sesión son usadas para iniciar sesión incluso cuando no puede acceder a los códigos de su autentificador.",
+ "recovery_keys_description_warning": "Las claves de recuperación no son mostrada de nuevo después de dejar esta página, manténgalas en un lugar seguro.
Después de que una clave de recuperación es utilizada ya no puede utilizarse de nuevo.",
+ "recovery_keys_error": "Error al generar códigos de recuperación",
+ "recovery_keys_no_key_set": "No hay códigos de recuperación establecidos",
+ "recovery_keys_generate": "Generar códigos de recuperación",
+ "recovery_keys_regenerate": "Regenerar códigos de recuperación",
+ "recovery_keys_used": "Usado: {{date}}",
+ "recovery_keys_unused": "El código de recuperación {{index}} está sin usar",
+ "oauth_title": "OAuth/OpenID",
+ "oauth_description": "OpenID es una forma estandarizada de permitirle iniciar sesión en sitios web utilizando una cuenta de otro servicio, como Google, para verificar su identidad. Siga estas instrucciones para configurar un servicio OpenID a través de Google.",
+ "oauth_description_warning": "Para habilitar OAuth/OpenID, necesita establecer la URL base de OAuth/OpenID, ID de cliente y secreto de cliente en el archivo config.ini y reiniciar la aplicación. Si desea establecerlas desde variables de ambiente, por favor establezca TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID y TRILIUM_OAUTH_CLIENT_SECRET.",
+ "oauth_missing_vars": "Ajustes faltantes: {{variables}}",
+ "oauth_user_account": "Cuenta de usuario: ",
+ "oauth_user_email": "Correo electrónico de usuario: ",
+ "oauth_user_not_logged_in": "¡No ha iniciado sesión!"
+ },
"shortcuts": {
"keyboard_shortcuts": "Atajos de teclado",
"multiple_shortcuts": "Varios atajos para la misma acción se pueden separar mediante comas.",
@@ -1431,7 +1624,9 @@
"widget": "Widget",
"confirm-change": "No es recomendado cambiar el tipo de nota cuando el contenido de la nota no está vacío. ¿Desea continuar de cualquier manera?",
"geo-map": "Mapa Geo",
- "beta-feature": "Beta"
+ "beta-feature": "Beta",
+ "ai-chat": "Chat de IA",
+ "task-list": "Lista de tareas"
},
"protect_note": {
"toggle-on": "Proteger la nota",
@@ -1541,7 +1736,9 @@
},
"clipboard": {
"cut": "La(s) notas(s) han sido cortadas al portapapeles.",
- "copied": "La(s) notas(s) han sido copiadas al portapapeles."
+ "copied": "La(s) notas(s) han sido copiadas al portapapeles.",
+ "copy_failed": "No se puede copiar al portapapeles debido a problemas de permisos.",
+ "copy_success": "Copiado al portapapeles."
},
"entrypoints": {
"note-revision-created": "Una revisión de nota ha sido creada.",
@@ -1584,7 +1781,7 @@
"auto-detect-language": "Detectado automáticamente"
},
"highlighting": {
- "title": "",
+ "title": "Bloques de código",
"description": "Controla el resaltado de sintaxis para bloques de código dentro de las notas de texto, las notas de código no serán afectadas.",
"color-scheme": "Esquema de color"
},
@@ -1592,7 +1789,8 @@
"word_wrapping": "Ajuste de palabras",
"theme_none": "Sin resaltado de sintaxis",
"theme_group_light": "Temas claros",
- "theme_group_dark": "Temas oscuros"
+ "theme_group_dark": "Temas oscuros",
+ "copy_title": "Copiar al portapapeles"
},
"classic_editor_toolbar": {
"title": "Formato"
@@ -1713,5 +1911,22 @@
},
"png_export_button": {
"button_title": "Exportar diagrama como PNG"
+ },
+ "svg": {
+ "export_to_png": "El diagrama no pudo ser exportado a PNG."
+ },
+ "code_theme": {
+ "title": "Apariencia",
+ "word_wrapping": "Ajuste de palabras",
+ "color-scheme": "Esquema de color"
+ },
+ "cpu_arch_warning": {
+ "title": "Por favor descargue la versión ARM64",
+ "message_macos": "TriliumNext está siendo ejecutado bajo traducción Rosetta 2, lo que significa que está usando la versión Intel (x64) en Apple Silicon Mac. Esto impactará significativamente en el rendimiento y la vida de la batería.",
+ "message_windows": "TriliumNext está siendo ejecutado bajo emulación, lo que significa que está usando la version Intel (x64) en Windows en un dispositivo ARM. Esto impactará significativamente en el rendimiento y la vida de la batería.",
+ "recommendation": "Para la mejor experiencia, por favor descargue la versión nativa ARM64 de TriliumNext desde nuestra página de lanzamientos.",
+ "download_link": "Descargar versión nativa",
+ "continue_anyway": "Continuar de todas maneras",
+ "dont_show_again": "No mostrar esta advertencia otra vez"
}
}
diff --git a/apps/client/src/translations/fr/translation.json b/apps/client/src/translations/fr/translation.json
index 74335e936..2ea871fc9 100644
--- a/apps/client/src/translations/fr/translation.json
+++ b/apps/client/src/translations/fr/translation.json
@@ -1,6 +1,6 @@
{
"about": {
- "title": "À propos de TriliumNext Notes",
+ "title": "À propos de Trilium Notes",
"close": "Fermer",
"homepage": "Page d'accueil :",
"app_version": "Version de l'application :",
@@ -639,7 +639,7 @@
"reload_frontend": "Recharger l'interface",
"show_hidden_subtree": "Afficher le Sous-arbre caché",
"show_help": "Afficher l'aide",
- "about": "À propos de TriliumNext Notes",
+ "about": "À propos de Trilium Notes",
"logout": "Déconnexion",
"show-cheatsheet": "Afficher l'aide rapide",
"toggle-zen-mode": "Zen Mode"
diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json
index 25b073e9e..537b43420 100644
--- a/apps/client/src/translations/ro/translation.json
+++ b/apps/client/src/translations/ro/translation.json
@@ -1,6 +1,6 @@
{
"about": {
- "title": "Despre TriliumNext Notes",
+ "title": "Despre Trilium Notes",
"homepage": "Site web:",
"app_version": "Versiune aplicație:",
"db_version": "Versiune bază de date:",
@@ -572,7 +572,7 @@
"system-default": "Fontul predefinit al sistemului"
},
"global_menu": {
- "about": "Despre TriliumNext Notes",
+ "about": "Despre Trilium Notes",
"advanced": "Opțiuni avansate",
"configure_launchbar": "Configurează bara de lansare",
"logout": "Deautentificare",
diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json
index c25504510..8a93a2281 100644
--- a/apps/client/src/translations/tw/translation.json
+++ b/apps/client/src/translations/tw/translation.json
@@ -1,6 +1,6 @@
{
"about": {
- "title": "關於 TriliumNext Notes",
+ "title": "關於 Trilium Notes",
"homepage": "項目主頁:",
"app_version": "軟件版本:",
"db_version": "資料庫版本:",
diff --git a/apps/client/src/widgets/type_widgets/ckeditor/config.ts b/apps/client/src/widgets/type_widgets/ckeditor/config.ts
index 4d4e1a27c..4eb15e913 100644
--- a/apps/client/src/widgets/type_widgets/ckeditor/config.ts
+++ b/apps/client/src/widgets/type_widgets/ckeditor/config.ts
@@ -1,13 +1,12 @@
import { ALLOWED_PROTOCOLS } from "../../../services/link.js";
import { MIME_TYPE_AUTO } from "@triliumnext/commons";
-import { buildExtraCommands, type EditorConfig } from "@triliumnext/ckeditor5";
+import { buildExtraCommands, type EditorConfig, PREMIUM_PLUGINS } from "@triliumnext/ckeditor5";
import { getHighlightJsNameForMime } from "../../../services/mime_types.js";
import options from "../../../services/options.js";
import { ensureMimeTypesForHighlighting, isSyntaxHighlightEnabled } from "../../../services/syntax_highlight.js";
import emojiDefinitionsUrl from "@triliumnext/ckeditor5/emoji_definitions/en.json?url";
import { copyTextWithToast } from "../../../services/clipboard_ext.js";
import getTemplates from "./snippets.js";
-import { PREMIUM_PLUGINS } from "../../../../../../packages/ckeditor5/src/plugins.js";
import { t } from "../../../services/i18n.js";
import { getMermaidConfig } from "../../../services/mermaid.js";
import noteAutocompleteService, { type Suggestion } from "../../../services/note_autocomplete.js";
@@ -30,22 +29,6 @@ export async function buildConfig(opts: BuildEditorOptions): Promise noteAutocompleteService.autocompleteSourceForCKEditor(queryText),
- itemRenderer: (item) => {
- const itemElement = document.createElement("button");
-
- itemElement.innerHTML = `${(item as Suggestion).highlightedNotePathTitle} `;
-
- return itemElement;
- },
- minimumCharacters: 0
- }
- ],
- },
codeBlock: {
languages: buildListOfLanguages()
},
@@ -180,7 +163,8 @@ export async function buildConfig(opts: BuildEditorOptions): Promise noteAutocompleteService.autocompleteSourceForCKEditor(queryText),
+ itemRenderer: (item) => {
+ const itemElement = document.createElement("button");
+
+ itemElement.innerHTML = `${(item as Suggestion).highlightedNotePathTitle} `;
+
+ return itemElement;
+ },
+ minimumCharacters: 0
+ }
+ ],
+ };
+ }
+
// Enable premium plugins.
if (hasPremiumLicense) {
config.extraPlugins = [
@@ -232,3 +236,13 @@ function getLicenseKey() {
return premiumLicenseKey;
}
+
+function getDisabledPlugins() {
+ let disabledPlugins: string[] = [];
+
+ if (options.get("textNoteEmojiCompletionEnabled") !== "true") {
+ disabledPlugins.push("EmojiMention");
+ }
+
+ return disabledPlugins;
+}
diff --git a/apps/client/src/widgets/type_widgets/content_widget.ts b/apps/client/src/widgets/type_widgets/content_widget.ts
index 77b86231d..beb9de272 100644
--- a/apps/client/src/widgets/type_widgets/content_widget.ts
+++ b/apps/client/src/widgets/type_widgets/content_widget.ts
@@ -46,6 +46,7 @@ import LanguageOptions from "./options/i18n/language.js";
import type BasicWidget from "../basic_widget.js";
import CodeTheme from "./options/code_notes/code_theme.js";
import RelatedSettings from "./options/appearance/related_settings.js";
+import EditorFeaturesOptions from "./options/text_notes/features.js";
const TPL = /*html*/`