From 2c71e995f20e0c61c62504ea2c274cf329b7403c Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 11 Oct 2025 20:46:29 +0300 Subject: [PATCH 01/18] feat(website/i18n): set up --- .vscode/settings.json | 3 ++- apps/website/package.json | 2 ++ apps/website/src/i18n.ts | 16 ++++++++++++++++ pnpm-lock.yaml | 16 ++++++++-------- 4 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 apps/website/src/i18n.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 9ee96f4c1..0c6d55c65 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,7 +5,8 @@ "i18n-ally.keystyle": "nested", "i18n-ally.localesPaths": [ "apps/server/src/assets/translations", - "apps/client/src/translations" + "apps/client/src/translations", + "apps/website/public/translations" ], "npm.exclude": [ "**/dist", diff --git a/apps/website/package.json b/apps/website/package.json index a818aba4d..d5aa5117c 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -8,6 +8,8 @@ "preview": "pnpm build && vite preview" }, "dependencies": { + "i18next": "25.6.0", + "i18next-http-backend": "3.0.2", "preact": "10.27.2", "preact-iso": "2.11.0", "preact-render-to-string": "6.6.2" diff --git a/apps/website/src/i18n.ts b/apps/website/src/i18n.ts new file mode 100644 index 000000000..4c7095704 --- /dev/null +++ b/apps/website/src/i18n.ts @@ -0,0 +1,16 @@ +import { default as i18next } from "i18next"; +import HttpApi from 'i18next-http-backend'; + +console.log("INIT I18NEXT"); +i18next.use(HttpApi) +await i18next.init({ + debug: true, + lng: "en", + fallbackLng: "en", + backend: { + loadPath: "/translations/{{lng}}/{{ns}}.json", + }, + returnEmptyString: false +}); + +export const t = i18next.t; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9951d6416..faa37e2a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -765,6 +765,12 @@ importers: apps/website: dependencies: + i18next: + specifier: 25.6.0 + version: 25.6.0(typescript@5.9.3) + i18next-http-backend: + specifier: 3.0.2 + version: 3.0.2(encoding@0.1.13) preact: specifier: 10.27.2 version: 10.27.2 @@ -14691,8 +14697,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.0.0 '@ckeditor/ckeditor5-utils': 47.0.0 ckeditor5: 47.0.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.0.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -14754,8 +14758,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.0.0 '@ckeditor/ckeditor5-watchdog': 47.0.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-dev-build-tools@43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -14969,8 +14971,6 @@ snapshots: '@ckeditor/ckeditor5-table': 47.0.0 '@ckeditor/ckeditor5-utils': 47.0.0 ckeditor5: 47.0.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-emoji@47.0.0': dependencies: @@ -15639,8 +15639,6 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.0.0 '@ckeditor/ckeditor5-ui': 47.0.0 '@ckeditor/ckeditor5-utils': 47.0.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-upload@47.0.0': dependencies: @@ -15698,6 +15696,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.0.0 ckeditor5: 47.0.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@codemirror/autocomplete@6.18.6': dependencies: From d56debaa9f85ce086db9755062041e5f0ebe1369 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 11 Oct 2025 20:46:41 +0300 Subject: [PATCH 02/18] feat(website/i18n): use translations in get-started --- apps/website/public/translations/en/translation.json | 9 +++++++++ apps/website/src/i18n.ts | 1 - apps/website/src/pages/GetStarted/get-started.tsx | 11 ++++++----- 3 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 apps/website/public/translations/en/translation.json diff --git a/apps/website/public/translations/en/translation.json b/apps/website/public/translations/en/translation.json new file mode 100644 index 000000000..4c459839d --- /dev/null +++ b/apps/website/public/translations/en/translation.json @@ -0,0 +1,9 @@ +{ + "get-started": { + "title": "Get started", + "desktop_title": "Download the desktop application (v{{version}})", + "architecture": "Architecture:", + "older_releases": "See older releases", + "server_title": "Set up a server for access on multiple devices" + } +} diff --git a/apps/website/src/i18n.ts b/apps/website/src/i18n.ts index 4c7095704..bce6a3b65 100644 --- a/apps/website/src/i18n.ts +++ b/apps/website/src/i18n.ts @@ -1,7 +1,6 @@ import { default as i18next } from "i18next"; import HttpApi from 'i18next-http-backend'; -console.log("INIT I18NEXT"); i18next.use(HttpApi) await i18next.init({ debug: true, diff --git a/apps/website/src/pages/GetStarted/get-started.tsx b/apps/website/src/pages/GetStarted/get-started.tsx index 37ad220bd..da19039f4 100644 --- a/apps/website/src/pages/GetStarted/get-started.tsx +++ b/apps/website/src/pages/GetStarted/get-started.tsx @@ -8,6 +8,7 @@ import Icon from "../../components/Icon.js"; import helpIcon from "../../assets/boxicons/bx-help-circle.svg?raw"; import "./get-started.css"; import packageJson from "../../../../../package.json" with { type: "json" }; +import { t } from "../../i18n.js"; export default function DownloadPage() { const [ currentArch, setCurrentArch ] = useState("x64"); @@ -18,13 +19,13 @@ export default function DownloadPage() { setUserPlatform(getPlatform() ?? "windows"); }, []); - usePageTitle("Get started"); + usePageTitle(t("get-started.title")); return ( <> -
+
- Architecture: + {t("get-started.architecture")}
{(["x64", "arm64"] as const).map(arch => ( @@ -45,11 +46,11 @@ export default function DownloadPage() {
-
+
{Object.entries(downloadMatrix.server).map(entry => ( From ffaa011c3e030ca04c2fa7bc0eac8b33702d8497 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 11 Oct 2025 21:00:03 +0300 Subject: [PATCH 03/18] feat(website/i18n): translate first three sections in the home page --- .../public/translations/en/translation.json | 32 +++++++++++++++++ apps/website/src/pages/Home/index.tsx | 35 ++++++++++--------- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/apps/website/public/translations/en/translation.json b/apps/website/public/translations/en/translation.json index 4c459839d..1e7f477e0 100644 --- a/apps/website/public/translations/en/translation.json +++ b/apps/website/public/translations/en/translation.json @@ -5,5 +5,37 @@ "architecture": "Architecture:", "older_releases": "See older releases", "server_title": "Set up a server for access on multiple devices" + }, + "hero_section": { + "title": "Organize your thoughts. Build your personal knowledge base.", + "subtitle": "Trilium is an open-source solution for note-taking and organizing a personal knowledge base. Use it locally on your desktop, or sync it with your self-hosted server to keep your notes everywhere you go.", + "get_started": "Get started", + "github": "GitHub", + "dockerhub": "Docker Hub", + "screenshot_alt": "Screenshot of the Trilium Notes desktop application" + }, + "organization_benefits": { + "title": "Organization", + "note_structure_title": "Note structure", + "note_structure_description": "Notes can be arranged hierarchically. There's no need for folders, since each note can contain sub-notes. A single note can be added in multiple places in the hierarchy.", + "attributes_title": "Note labels and relationships", + "attributes_description": "Use relations between notes or add labels for easy categorization. Use promoted attributes to enter structured information which can be used in tables, boards.", + "hoisting_title": "Workspaces and hoisting", + "hoisting_description": "Easily separate your personal and work notes by grouping them under a workspace, which focuses your note tree to only show a specific set of notes." + }, + "productivity_benefits": { + "title": "Productivity and safety", + "revisions_title": "Note revisions", + "revisions_content": "Notes are periodically saved in the background and revisions can be used for review or to undo accidental changes. Revisions can also be created on-demand.", + "sync_title": "Synchronization", + "sync_content": "Use a self-hosted or cloud instance to easily synchronize your notes across multiple devices, and to access it from your mobile phone using a PWA.", + "protected_notes_title": "Protected notes", + "protected_notes_content": "Protect sensitive personal information by encrypting the notes and locking them behind a password-protected session.", + "jump_to_title": "Quick search and commands", + "jump_to_content": "Jump quickly to notes or UI commands across the hierarchy by searching for their title, with fuzzy matching to account for typos or slight differences.", + "search_title": "Powerful search", + "search_content": "Or search for text inside notes and narrow down the search by filtering by the parent note, or by depth.", + "web_clipper_title": "Web clipper", + "web_clipper_content": "Grab web pages (or screenshots) and place them directly into Trilium using the web clipper browser extension." } } diff --git a/apps/website/src/pages/Home/index.tsx b/apps/website/src/pages/Home/index.tsx index d9e52e819..4123a14b8 100644 --- a/apps/website/src/pages/Home/index.tsx +++ b/apps/website/src/pages/Home/index.tsx @@ -31,6 +31,7 @@ import boardIcon from "../../assets/boxicons/bx-columns-3.svg?raw"; import geomapIcon from "../../assets/boxicons/bx-map.svg?raw"; import { getPlatform } from '../../download-helper.js'; import { useEffect, useState } from 'preact/hooks'; +import { t } from '../../i18n.js'; export function Home() { usePageTitle(""); @@ -72,22 +73,22 @@ function HeroSection() { return (
-

Organize your thoughts. Build your personal knowledge base.

-

Trilium is an open-source solution for note-taking and organizing a personal knowledge base. Use it locally on your desktop, or sync it with your self-hosted server to keep your notes everywhere you go.

+

{t("hero_section.title")}

+

{t("hero_section.subtitle")}

-
- {screenshotUrl && Screenshot of the Trilium Notes desktop application} + {screenshotUrl && {t("hero_section.screenshot_alt")}}
) @@ -96,11 +97,11 @@ function HeroSection() { function OrganizationBenefitsSection() { return ( <> -
+
- Notes can be arranged hierarchically. There's no need for folders, since each note can contain sub-notes. A single note can be added in multiple places in the hierarchy. - Use relations between notes or add labels for easy categorization. Use promoted attributes to enter structured information which can be used in tables, boards. - Easily separate your personal and work notes by grouping them under a workspace, which focuses your note tree to only show a specific set of notes. + {t("organization_benefits.note_structure_description")} + {t("organization_benefits.attributes_description")} + {t("organization_benefits.hoisting_description")}
@@ -110,14 +111,14 @@ function OrganizationBenefitsSection() { function ProductivityBenefitsSection() { return ( <> -
+
- Notes are periodically saved in the background and revisions can be used for review or to undo accidental changes. Revisions can also be created on-demand. - Use a self-hosted or cloud instance to easily synchronize your notes across multiple devices, and to access it from your mobile phone using a PWA. - Protect sensitive personal information by encrypting the notes and locking them behind a password-protected session. - Jump quickly to notes or UI commands across the hierarchy by searching for their title, with fuzzy matching to account for typos or slight differences. - Or search for text inside notes and narrow down the search by filtering by the parent note, or by depth. - Grab web pages (or screenshots) and place them directly into Trilium using the web clipper browser extension. + {t("productivity_benefits.revisions_content")} + {t("productivity_benefits.sync_content")} + {t("productivity_benefits.protected_notes_content")} + {t("productivity_benefits.jump_to_content")} + {t("productivity_benefits.search_content")} + {t("productivity_benefits.web_clipper_content")}
From ee9de82203bf38ca9e9d5c287d26ef7b71d8e920 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 11 Oct 2025 22:08:53 +0300 Subject: [PATCH 04/18] feat(website/i18n): translate note types --- .../public/translations/en/translation.json | 21 +++++++++++ apps/website/src/pages/Home/index.tsx | 36 +++++++++---------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/apps/website/public/translations/en/translation.json b/apps/website/public/translations/en/translation.json index 1e7f477e0..3c5a43b08 100644 --- a/apps/website/public/translations/en/translation.json +++ b/apps/website/public/translations/en/translation.json @@ -37,5 +37,26 @@ "search_content": "Or search for text inside notes and narrow down the search by filtering by the parent note, or by depth.", "web_clipper_title": "Web clipper", "web_clipper_content": "Grab web pages (or screenshots) and place them directly into Trilium using the web clipper browser extension." + }, + "note_types": { + "text_title": "Text notes", + "text_description": "The notes are edited using a visual (WYSIWYG) editor, with support for tables, images, math expressions, code blocks with syntax highlighting. Quickly format the text using Markdown-like syntax or using slash commands.", + "code_title": "Code notes", + "code_description": "Large samples of source code or scripts use a dedicated editor, with syntax highlighting for many programming languages and with various color themes.", + "file_title": "File notes", + "file_description": "Embed multimedia files such as PDFs, images, videos with an in-application preview.", + "canvas_title": "Canvas", + "canvas_description": "Arrange shapes, images and text across an infinite canvas, using the same technology behind excalidraw.com. Ideal for diagrams, sketches and visual planning.", + "mermaid_title": "Mermaid diagrams", + "mermaid_description": "Create diagrams such as flowcharts, class & sequence diagrams, Gantt charts and many more, using the Mermaid syntax.", + "mindmap_title": "Mindmap", + "mindmap_description": "Organize your thoughts visually or do a brainstorming session.", + "others_prefix": "and others: ", + "others_separator": ", ", + "others_note_map": "note map", + "others_relation_map": "relation map", + "others_saved_searches": "saved searches", + "others_render_note": "render note", + "others_webview": "web views" } } diff --git a/apps/website/src/pages/Home/index.tsx b/apps/website/src/pages/Home/index.tsx index 4123a14b8..a78c63ac0 100644 --- a/apps/website/src/pages/Home/index.tsx +++ b/apps/website/src/pages/Home/index.tsx @@ -130,55 +130,55 @@ function NoteTypesSection() {

- and others:{" "} - note map,{" "} - relation map,{" "} - saved searches,{" "} - render note,{" "} - web views. + {t("note_types.others_prefix")} + {t("note_types.others_note_map")}{t("note_types.others_separator")} + {t("note_types.others_relation_map")}{t("note_types.others_separator")} + {t("note_types.others_saved_searches")}{t("note_types.others_separator")} + {t("note_types.others_render_note")}{t("note_types.others_separator")} + {t("note_types.others_webview")}.

); From e32ba61a3caf2097e1049b18a02d6ba056c989c4 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 11 Oct 2025 22:16:01 +0300 Subject: [PATCH 05/18] feat(website/i18n): translate extensibility benefits --- apps/website/public/translations/en/translation.json | 11 +++++++++++ apps/website/src/pages/Home/index.tsx | 10 +++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/website/public/translations/en/translation.json b/apps/website/public/translations/en/translation.json index 3c5a43b08..b58ab0877 100644 --- a/apps/website/public/translations/en/translation.json +++ b/apps/website/public/translations/en/translation.json @@ -58,5 +58,16 @@ "others_saved_searches": "saved searches", "others_render_note": "render note", "others_webview": "web views" + }, + "extensibility_benefits": { + "title": "Sharing & extensibility", + "import_export_title": "Import/export", + "import_export_description": "Easily interact with other applications using Markdown, ENEX, OML formats.", + "share_title": "Share notes on the web", + "share_description": "If you have a server, it can be used to share a subset of your notes with other people.", + "scripting_title": "Advanced scripting", + "scripting_description": "Build your own integrations within Trilium with custom widgets, or server-side logic.", + "api_title": "REST API", + "api_description": "Interact with Trilium programatically using its builtin REST API." } } diff --git a/apps/website/src/pages/Home/index.tsx b/apps/website/src/pages/Home/index.tsx index a78c63ac0..3bacac5bf 100644 --- a/apps/website/src/pages/Home/index.tsx +++ b/apps/website/src/pages/Home/index.tsx @@ -187,12 +187,12 @@ function NoteTypesSection() { function ExtensibilityBenefitsSection() { return ( <> -
+
- Easily interact with other applications using Markdown, ENEX, OML formats. - If you have a server, it can be used to share a subset of your notes with other people. - Build your own integrations within Trilium with custom widgets, or server-side logic. - Interact with Trilium programatically using its builtin REST API. + {t("extensibility_benefits.import_export_description")} + {t("extensibility_benefits.share_description")} + {t("extensibility_benefits.scripting_description")} + {t("extensibility_benefits.api_description")}
From 07eb3f64e33e346e770229d75a5e5f6a5dc11b1e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 11 Oct 2025 22:19:08 +0300 Subject: [PATCH 06/18] feat(website/i18n): translate collections --- .../public/translations/en/translation.json | 10 ++++++++++ apps/website/src/pages/Home/index.tsx | 17 +++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/apps/website/public/translations/en/translation.json b/apps/website/public/translations/en/translation.json index b58ab0877..5fd242df9 100644 --- a/apps/website/public/translations/en/translation.json +++ b/apps/website/public/translations/en/translation.json @@ -69,5 +69,15 @@ "scripting_description": "Build your own integrations within Trilium with custom widgets, or server-side logic.", "api_title": "REST API", "api_description": "Interact with Trilium programatically using its builtin REST API." + }, + "collections": { + "calendar_title": "Calendar", + "calendar_description": "Organize your personal or professional events using a calendar, with support for all-day and multi-day events. See your events at a glance with the week, month and year views. Easy interaction to add or drag events.", + "table_title": "Table", + "table_description": "Display and edit information about notes in a tabular structure, with various column types such as text, number, check boxes, date & time, links and colors and support for relations. Optionally, display the notes within a tree hierarchy inside the table.", + "board_title": "Board", + "board_description": "Organize your tasks or project status into a Kanban board with an easy way to create new items and columns and simply changing their status by dragging across the board.", + "geomap_title": "Geomap", + "geomap_description": "Plan your vacations or mark your points of interest directly on a geographical map using customizable markers. Display recorded GPX tracks to track itineraries." } } diff --git a/apps/website/src/pages/Home/index.tsx b/apps/website/src/pages/Home/index.tsx index 3bacac5bf..782b32ad4 100644 --- a/apps/website/src/pages/Home/index.tsx +++ b/apps/website/src/pages/Home/index.tsx @@ -204,31 +204,32 @@ function CollectionsSection() {
From ce88afee1bff998b0d5d98d557927d72d7726b1e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 11 Oct 2025 22:26:10 +0300 Subject: [PATCH 07/18] feat(website/i18n): translate FAQ section --- .../public/translations/en/translation.json | 19 +++++++++++++++++++ apps/website/src/components/Card.tsx | 3 ++- apps/website/src/pages/Home/index.tsx | 16 ++++++++-------- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/apps/website/public/translations/en/translation.json b/apps/website/public/translations/en/translation.json index 5fd242df9..969ccc48d 100644 --- a/apps/website/public/translations/en/translation.json +++ b/apps/website/public/translations/en/translation.json @@ -79,5 +79,24 @@ "board_description": "Organize your tasks or project status into a Kanban board with an easy way to create new items and columns and simply changing their status by dragging across the board.", "geomap_title": "Geomap", "geomap_description": "Plan your vacations or mark your points of interest directly on a geographical map using customizable markers. Display recorded GPX tracks to track itineraries." + }, + "faq": { + "title": "Frequently Asked Questions", + "mobile_question": "Is there a mobile application?", + "mobile_answer": "Currently there is no official mobile application. However, if you have a server instance you can access it using a web browser and even install it as a PWA. For Android, there is an unofficial application called TriliumDroid that even works offline (same as a desktop client).", + "database_question": "Where is the data stored?", + "database_answer": "All your notes will be stored in an SQLite database in an application folder. The reasoning why Trilium uses a database instead of plain text files is both performance and some features would be much more difficult to implement such as clones (same note in multiple places in the tree). To find the application folder, simply go to the About window.", + "server_question": "Do I need a server to use Trilium?", + "server_answer": "No, the server allows access via a web browser and manages the synchronization if you have multiple devices. To get started, it's enough to download the desktop application and start using it.", + "scaling_question": "How well does the application scale with a large amount of notes?", + "scaling_answer": "Depending on usage, the application should be able to handle at least 100.000 notes without an issue. Do note that the sync process can sometimes fail if uploading many large files (> 1 GB per file) since Trilium is meant more as a knowledge base application rather than a file store (like NextCloud, for example).", + "network_share_question": "Can I share my database over a network drive?", + "network_share_answer": "No, it's generally not a good idea to share a SQLite database over a network drive. Although sometimes it might work, there are chances that the database will get corrupted due to imperfect file locks over a network.", + "security_question": "How is my data protected?", + "security_answer": "By default, notes are not encrypted and can be read directly from the database. Once a note is marked as encrypted, the note is encrypted using AES-128-CBC." + }, + "components": { + "link_learn_more": "Learn more...", + "list_with_screenshot_alt": "Screenshot of the feature being selected" } } diff --git a/apps/website/src/components/Card.tsx b/apps/website/src/components/Card.tsx index 49c357132..593a9025b 100644 --- a/apps/website/src/components/Card.tsx +++ b/apps/website/src/components/Card.tsx @@ -1,6 +1,7 @@ import { ComponentChildren, HTMLAttributes } from "preact"; import { Link } from "./Button.js"; import Icon from "./Icon.js"; +import { t } from "../i18n.js"; interface CardProps extends Omit, "title"> { title: ComponentChildren; @@ -28,7 +29,7 @@ export default function Card({ title, children, imageUrl, iconSvg, className, mo {moreInfoUrl && (
- Learn more... + {t("components.link_learn_more")}
)} diff --git a/apps/website/src/pages/Home/index.tsx b/apps/website/src/pages/Home/index.tsx index 782b32ad4..abb82eb28 100644 --- a/apps/website/src/pages/Home/index.tsx +++ b/apps/website/src/pages/Home/index.tsx @@ -264,7 +264,7 @@ function ListWithScreenshot({ items, horizontal, cardExtra }: {
{selectedItem && ( <> - Screenshot of the feature being selected + {t("components.list_with_screenshot_alt")} )}
@@ -274,14 +274,14 @@ function ListWithScreenshot({ items, horizontal, cardExtra }: { function FaqSection() { return ( -
+
- Currently there is no official mobile application. However, if you have a server instance you can access it using a web browser and even install it as a PWA. For Android, there is an unofficial application called TriliumDroid that even works offline (same as a desktop client). - All your notes will be stored in an SQLite database in an application folder. The reasoning why Trilium uses a database instead of plain text files is both performance and some features would be much more difficult to implement such as clones (same note in multiple places in the tree). To find the application folder, simply go to the About window. - No, the server allows access via a web browser and manages the synchronization if you have multiple devices. To get started, it's enough to download the desktop application and start using it. - Depending on usage, the application should be able to handle at least 100.000 notes without an issue. Do note that the sync process can sometimes fail if uploading many large files (> 1 GB per file) since Trilium is meant more as a knowledge base application rather than a file store (like NextCloud, for example). - No, it's generally not a good idea to share a SQLite database over a network drive. Although sometimes it might work, there are chances that the database will get corrupted due to imperfect file locks over a network. - By default, notes are not encrypted and can be read directly from the database. Once a note is marked as encrypted, the note is encrypted using AES-128-CBC. + {t("faq.mobile_answer")} + {t("faq.database_answer")} + {t("faq.server_answer")} + {t("faq.scaling_answer")} + {t("faq.network_share_answer")} + {t("faq.security_answer")}
); From fc9f2bceb04195219cd0f5dd1831adecb84543c0 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 11 Oct 2025 22:27:15 +0300 Subject: [PATCH 08/18] feat(website/i18n): translate final call-to-action --- apps/website/public/translations/en/translation.json | 5 +++++ apps/website/src/pages/Home/index.tsx | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/website/public/translations/en/translation.json b/apps/website/public/translations/en/translation.json index 969ccc48d..73122853c 100644 --- a/apps/website/public/translations/en/translation.json +++ b/apps/website/public/translations/en/translation.json @@ -95,6 +95,11 @@ "security_question": "How is my data protected?", "security_answer": "By default, notes are not encrypted and can be read directly from the database. Once a note is marked as encrypted, the note is encrypted using AES-128-CBC." }, + "final_cta": { + "title": "Ready to get started with Trilium Notes?", + "description": "Build your personal knowledge base with powerful features and full privacy.", + "get_started": "Get started" + }, "components": { "link_learn_more": "Learn more...", "list_with_screenshot_alt": "Screenshot of the feature being selected" diff --git a/apps/website/src/pages/Home/index.tsx b/apps/website/src/pages/Home/index.tsx index abb82eb28..37e5c5f00 100644 --- a/apps/website/src/pages/Home/index.tsx +++ b/apps/website/src/pages/Home/index.tsx @@ -297,11 +297,11 @@ function FaqItem({ question, children }: { question: string; children: Component function FinalCta() { return ( -
-

Build your personal knowledge base with powerful features and full privacy.

+
+

{t("final_cta.description")}

-
) From 6fe261836e8b473549cc8d6d1c9779ee87885db3 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 11 Oct 2025 22:34:43 +0300 Subject: [PATCH 09/18] feat(website/i18n): translate download button --- .../public/translations/en/translation.json | 8 ++++++++ apps/website/src/components/DownloadButton.tsx | 15 ++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/apps/website/public/translations/en/translation.json b/apps/website/public/translations/en/translation.json index 73122853c..616919e1c 100644 --- a/apps/website/public/translations/en/translation.json +++ b/apps/website/public/translations/en/translation.json @@ -103,5 +103,13 @@ "components": { "link_learn_more": "Learn more...", "list_with_screenshot_alt": "Screenshot of the feature being selected" + }, + "download_now": { + "text": "Download now ", + "platform_big": "v{{version}} for {{platform}}", + "platform_small": "for {{platform}}", + "linux_big": "v{{version}} for Linux", + "linux_small": "for Linux", + "more_platforms": "More platforms & server setup" } } diff --git a/apps/website/src/components/DownloadButton.tsx b/apps/website/src/components/DownloadButton.tsx index 815f4cad8..119b0315e 100644 --- a/apps/website/src/components/DownloadButton.tsx +++ b/apps/website/src/components/DownloadButton.tsx @@ -4,6 +4,7 @@ import Button from "./Button.js"; import downloadIcon from "../assets/boxicons/bx-arrow-in-down-square-half.svg?raw"; import packageJson from "../../../../package.json" with { type: "json" }; import { useEffect, useState } from "preact/hooks"; +import { t } from "../i18n.js"; interface DownloadButtonProps { big?: boolean; @@ -24,10 +25,10 @@ export default function DownloadButton({ big }: DownloadButtonProps) { href={recommendedDownload.url} iconSvg={downloadIcon} text={<> - Download now{" "} + {t("download_now.text")} {big - ? v{packageJson.version} for {recommendedDownload.name} - : for {recommendedDownload.name} + ? {t("download_now.platform_big", { version: packageJson.version, platform: recommendedDownload.name })} + : {t("download_now.platform_small", { platform: recommendedDownload.name })} } } /> @@ -37,17 +38,17 @@ export default function DownloadButton({ big }: DownloadButtonProps) { href="/get-started/" iconSvg={downloadIcon} text={<> - Download now{" "} + {t("download_now.text")} {big - ? v{packageJson.version} for Linux - : for Linux + ? {t("download_now.linux_big")} + : {t("download_now.linux_small")} } } /> )} {big && ( - More platforms & server setup + {t("download_now.more_platforms")} )} ) From fb2afb57945857c0063002a1670227b6ea41717f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 11 Oct 2025 22:45:37 +0300 Subject: [PATCH 10/18] feat(website/i18n): translate footer --- .../website/public/translations/en/translation.json | 12 +++++++++++- apps/website/src/components/Footer.tsx | 13 +++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/apps/website/public/translations/en/translation.json b/apps/website/public/translations/en/translation.json index 616919e1c..9b46dc611 100644 --- a/apps/website/public/translations/en/translation.json +++ b/apps/website/public/translations/en/translation.json @@ -89,7 +89,7 @@ "server_question": "Do I need a server to use Trilium?", "server_answer": "No, the server allows access via a web browser and manages the synchronization if you have multiple devices. To get started, it's enough to download the desktop application and start using it.", "scaling_question": "How well does the application scale with a large amount of notes?", - "scaling_answer": "Depending on usage, the application should be able to handle at least 100.000 notes without an issue. Do note that the sync process can sometimes fail if uploading many large files (> 1 GB per file) since Trilium is meant more as a knowledge base application rather than a file store (like NextCloud, for example).", + "scaling_answer": "Depending on usage, the application should be able to handle at least 100.000 notes without an issue. Do note that the sync process can sometimes fail if uploading many large files (1 GB per file) since Trilium is meant more as a knowledge base application rather than a file store (like NextCloud, for example).", "network_share_question": "Can I share my database over a network drive?", "network_share_answer": "No, it's generally not a good idea to share a SQLite database over a network drive. Although sometimes it might work, there are chances that the database will get corrupted due to imperfect file locks over a network.", "security_question": "How is my data protected?", @@ -111,5 +111,15 @@ "linux_big": "v{{version}} for Linux", "linux_small": "for Linux", "more_platforms": "More platforms & server setup" + }, + "footer": { + "copyright_and_the": " and the ", + "copyright_community": "community" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "GitHub Discussions", + "matrix": "Matrix", + "reddit": "Reddit" } } diff --git a/apps/website/src/components/Footer.tsx b/apps/website/src/components/Footer.tsx index a652e524c..04033f565 100644 --- a/apps/website/src/components/Footer.tsx +++ b/apps/website/src/components/Footer.tsx @@ -5,13 +5,14 @@ import githubDiscussionsIcon from "../assets/boxicons/bx-discussion.svg?raw"; import matrixIcon from "../assets/boxicons/bx-message-dots.svg?raw"; import redditIcon from "../assets/boxicons/bx-reddit.svg?raw"; import { Link } from "./Button.js"; +import { t } from "../i18n"; export default function Footer() { return (