diff --git a/apps/client/src/print.tsx b/apps/client/src/print.tsx index de11d581a..3dbdf1de0 100644 --- a/apps/client/src/print.tsx +++ b/apps/client/src/print.tsx @@ -56,7 +56,20 @@ function SingleNoteRenderer({ note, onReady }: RendererProps) { await import("@triliumnext/ckeditor5/src/theme/ck-content.css"); } const { $renderedContent } = await content_renderer.getRenderedContent(note, { noChildrenList: true }); - containerRef.current?.replaceChildren(...$renderedContent); + const container = containerRef.current!; + container.replaceChildren(...$renderedContent); + + // Wait for all images to load. + const images = Array.from(container.querySelectorAll("img")); + await Promise.all( + images.map(img => { + if (img.complete) return Promise.resolve(); + return new Promise(resolve => { + img.addEventListener("load", () => resolve(), { once: true }); + img.addEventListener("error", () => resolve(), { once: true }); + }); + }) + ); } load().then(() => requestAnimationFrame(onReady)) diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index 6b741de7b..b3f4c9a46 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -1658,7 +1658,7 @@ "add-term-to-dictionary": "Begriff \"{{term}}\" zum Wörterbuch hinzufügen", "cut": "Ausschneiden", "copy": "Kopieren", - "copy-link": "Link opieren", + "copy-link": "Link kopieren", "paste": "Einfügen", "paste-as-plain-text": "Als unformatierten Text einfügen", "search_online": "Suche nach \"{{term}}\" mit {{searchEngine}} starten" diff --git a/apps/client/src/translations/nl/translation.json b/apps/client/src/translations/nl/translation.json index d07df69e5..de5cfb6c7 100644 --- a/apps/client/src/translations/nl/translation.json +++ b/apps/client/src/translations/nl/translation.json @@ -13,6 +13,13 @@ "critical-error": { "title": "Kritische Error", "message": "Een kritieke fout heeft plaatsgevonden waardoor de cliënt zich aanmeldt vanaf het begin:\n\n84X\n\nDit is waarschijnlijk veroorzaakt door een script dat op een onverwachte manier faalt. Probeer de sollicitatie in veilige modus te starten en de kwestie aan te spreken." + }, + "widget-error": { + "title": "Starten widget mislukt", + "message-unknown": "Onbekende widget kan niet gestart worden omdat:\n\n{{message}}" + }, + "bundle-error": { + "title": "Custom script laden mislukt" } }, "add_link": { diff --git a/apps/client/src/widgets/dialogs/popup_editor.ts b/apps/client/src/widgets/dialogs/popup_editor.ts index 1deb584d9..f08719a93 100644 --- a/apps/client/src/widgets/dialogs/popup_editor.ts +++ b/apps/client/src/widgets/dialogs/popup_editor.ts @@ -155,6 +155,11 @@ export default class PopupEditorDialog extends Container { return Promise.resolve(); } + // Avoid not showing recent notes when creating a new empty tab. + if ("noteContext" in data && data.noteContext.ntxId !== "_popup-editor") { + return Promise.resolve(); + } + return super.handleEventInChildren(name, data); } diff --git a/apps/desktop/electron-forge/trilium-no-cert-check.bat b/apps/desktop/electron-forge/trilium-no-cert-check.bat index cfc345c42..d3405b497 100644 --- a/apps/desktop/electron-forge/trilium-no-cert-check.bat +++ b/apps/desktop/electron-forge/trilium-no-cert-check.bat @@ -6,7 +6,7 @@ WHERE powershell.exe > NUL 2>&1 IF %ERRORLEVEL% NEQ 0 GOTO BATCH ELSE GOTO POWERSHELL :POWERSHELL -powershell -ExecutionPolicy Bypass -NonInteractive -NoLogo "Set-Item -Path Env:NODE_TLS_REJECT_UNAUTHORIZED -Value 0; ./trilium.exe" +powershell -ExecutionPolicy Bypass -NonInteractive -NoLogo -Command "Set-Item -Path Env:NODE_TLS_REJECT_UNAUTHORIZED -Value 0; ./trilium.exe" GOTO END :BATCH diff --git a/apps/desktop/electron-forge/trilium-portable.bat b/apps/desktop/electron-forge/trilium-portable.bat index b6eeb853f..5b71c9cf2 100644 --- a/apps/desktop/electron-forge/trilium-portable.bat +++ b/apps/desktop/electron-forge/trilium-portable.bat @@ -6,7 +6,7 @@ WHERE powershell.exe > NUL 2>&1 IF %ERRORLEVEL% NEQ 0 GOTO BATCH ELSE GOTO POWERSHELL :POWERSHELL -powershell -ExecutionPolicy Bypass -NonInteractive -NoLogo "Set-Item -Path Env:TRILIUM_DATA_DIR -Value './trilium-data'; ./trilium.exe" +powershell -ExecutionPolicy Bypass -NonInteractive -NoLogo -Command "Set-Item -Path Env:TRILIUM_DATA_DIR -Value './trilium-data'; ./trilium.exe" GOTO END :BATCH diff --git a/apps/desktop/electron-forge/trilium-safe-mode.bat b/apps/desktop/electron-forge/trilium-safe-mode.bat index 7e0fafa99..e112896f7 100644 --- a/apps/desktop/electron-forge/trilium-safe-mode.bat +++ b/apps/desktop/electron-forge/trilium-safe-mode.bat @@ -6,7 +6,7 @@ WHERE powershell.exe > NUL 2>&1 IF %ERRORLEVEL% NEQ 0 GOTO BATCH ELSE GOTO POWERSHELL :POWERSHELL -powershell -ExecutionPolicy Bypass -NonInteractive -NoLogo "Set-Item -Path Env:TRILIUM_SAFE_MODE -Value 1; ./trilium.exe --disable-gpu" +powershell -ExecutionPolicy Bypass -NonInteractive -NoLogo -Command "Set-Item -Path Env:TRILIUM_SAFE_MODE -Value 1; ./trilium.exe --disable-gpu" GOTO END :BATCH diff --git a/apps/website/index.html b/apps/website/index.html index 798ca14f9..55cb4fa6a 100644 --- a/apps/website/index.html +++ b/apps/website/index.html @@ -1,5 +1,5 @@ - + diff --git a/apps/website/src/i18n.spec.ts b/apps/website/src/i18n.spec.ts index eab06ba5a..fcc8d790a 100644 --- a/apps/website/src/i18n.spec.ts +++ b/apps/website/src/i18n.spec.ts @@ -19,6 +19,7 @@ describe("swapLocale", () => { expect(swapLocaleInUrl("/ro/get-started", "ro")).toStrictEqual("/ro/get-started"); expect(swapLocaleInUrl("/en/get-started", "ro")).toStrictEqual("/ro/get-started"); expect(swapLocaleInUrl("/ro/", "en")).toStrictEqual("/en/"); + expect(swapLocaleInUrl("/ro", "en")).toStrictEqual("/en"); }); }); diff --git a/apps/website/src/i18n.ts b/apps/website/src/i18n.ts index 435245217..93931d936 100644 --- a/apps/website/src/i18n.ts +++ b/apps/website/src/i18n.ts @@ -1,9 +1,36 @@ +import i18next from "i18next"; +import { initReactI18next } from "react-i18next"; + interface Locale { id: string; name: string; rtl?: boolean; } +i18next.use(initReactI18next); +const localeFiles = import.meta.glob("./translations/*/translation.json", { eager: true }); +const resources: Record>> = {}; +for (const [path, module] of Object.entries(localeFiles)) { + const id = path.split("/").at(-2); + if (!id) continue; + + const translations = (module as any).default ?? module; + resources[id] = { translation: translations }; +} + +export function initTranslations(lng: string) { + i18next.init({ + fallbackLng: "en", + lng, + returnEmptyString: false, + resources, + initAsync: false, + react: { + useSuspense: false + } + }); +} + export const LOCALES: Locale[] = [ { id: "en", name: "English" }, { id: "ro", name: "Română" }, @@ -35,7 +62,13 @@ export function mapLocale(locale: string) { export function swapLocaleInUrl(url: string, newLocale: string) { const components = url.split("/"); if (components.length === 2) { - return `/${newLocale}${url}`; + const potentialLocale = components[1]; + const correspondingLocale = LOCALES.find(l => l.id === potentialLocale); + if (correspondingLocale) { + return `/${newLocale}`; + } else { + return `/${newLocale}${url}`; + } } else { components[1] = newLocale; return components.join("/"); diff --git a/apps/website/src/index.tsx b/apps/website/src/index.tsx index 8cbea3d0e..5bef0fad2 100644 --- a/apps/website/src/index.tsx +++ b/apps/website/src/index.tsx @@ -8,11 +8,9 @@ import Footer from './components/Footer.js'; import GetStarted from './pages/GetStarted/get-started.js'; import SupportUs from './pages/SupportUs/SupportUs.js'; import { createContext } from 'preact'; -import { useLayoutEffect, useState } from 'preact/hooks'; -import { default as i18next, changeLanguage } from 'i18next'; -import { extractLocaleFromUrl, LOCALES, mapLocale } from './i18n'; -import HttpApi from 'i18next-http-backend'; -import { initReactI18next } from "react-i18next"; +import { useLayoutEffect, useRef } from 'preact/hooks'; +import { changeLanguage } from 'i18next'; +import { extractLocaleFromUrl, initTranslations, LOCALES, mapLocale } from './i18n'; export const LocaleContext = createContext('en'); @@ -42,34 +40,26 @@ export function App(props: {repoStargazersCount: number}) { export function LocaleProvider({ children }) { const { path } = useLocation(); - const localeId = mapLocale(extractLocaleFromUrl(path) || navigator.language); - const [ loaded, setLoaded ] = useState(false); + const localeId = getLocaleId(path); + const loadedRef = useRef(false); - useLayoutEffect(() => { - i18next - .use(HttpApi) - .use(initReactI18next); - i18next.init({ - lng: localeId, - fallbackLng: "en", - backend: { - loadPath: "/translations/{{lng}}/{{ns}}.json", - }, - returnEmptyString: false - }).then(() => setLoaded(true)) -}, []); - - useLayoutEffect(() => { - if (!loaded) return; + if (!loadedRef.current) { + initTranslations(localeId); + loadedRef.current = true; + } else { changeLanguage(localeId); + } + + // Update html lang and dir attributes + useLayoutEffect(() => { const correspondingLocale = LOCALES.find(l => l.id === localeId); document.documentElement.lang = localeId; document.documentElement.dir = correspondingLocale?.rtl ? "rtl" : "ltr"; - }, [ loaded, localeId ]); + }, [localeId]); return ( - {loaded && children} + {children} ); } @@ -78,12 +68,26 @@ if (typeof window !== 'undefined') { hydrate(, document.getElementById('app')!); } +function getLocaleId(path: string) { + const extractedLocale = extractLocaleFromUrl(path); + if (extractedLocale) return mapLocale(extractedLocale); + if (typeof window === "undefined") return 'en'; + return mapLocale(navigator.language); +} + export async function prerender(data) { // Fetch the stargazer count of the Trilium's GitHub repo on prerender to pass // it to the App component for SSR. // This ensures the GitHub API is not called on every page load in the client. const stargazersCount = await getRepoStargazersCount(); - return await ssr(); + const { html, links } = await ssr(); + return { + html, + links, + head: { + lang: extractLocaleFromUrl(data.url) ?? "en" + } + } } diff --git a/apps/website/public/translations/ar/translation.json b/apps/website/src/translations/ar/translation.json similarity index 100% rename from apps/website/public/translations/ar/translation.json rename to apps/website/src/translations/ar/translation.json diff --git a/apps/website/public/translations/ca/translation.json b/apps/website/src/translations/ca/translation.json similarity index 100% rename from apps/website/public/translations/ca/translation.json rename to apps/website/src/translations/ca/translation.json diff --git a/apps/website/public/translations/cs/translation.json b/apps/website/src/translations/cs/translation.json similarity index 100% rename from apps/website/public/translations/cs/translation.json rename to apps/website/src/translations/cs/translation.json diff --git a/apps/website/public/translations/de/translation.json b/apps/website/src/translations/de/translation.json similarity index 100% rename from apps/website/public/translations/de/translation.json rename to apps/website/src/translations/de/translation.json diff --git a/apps/website/public/translations/el/translation.json b/apps/website/src/translations/el/translation.json similarity index 100% rename from apps/website/public/translations/el/translation.json rename to apps/website/src/translations/el/translation.json diff --git a/apps/website/public/translations/en/translation.json b/apps/website/src/translations/en/translation.json similarity index 100% rename from apps/website/public/translations/en/translation.json rename to apps/website/src/translations/en/translation.json diff --git a/apps/website/public/translations/es/translation.json b/apps/website/src/translations/es/translation.json similarity index 99% rename from apps/website/public/translations/es/translation.json rename to apps/website/src/translations/es/translation.json index 2f7316d5e..cba0aba90 100644 --- a/apps/website/public/translations/es/translation.json +++ b/apps/website/src/translations/es/translation.json @@ -95,8 +95,7 @@ "get_started": "Comenzar" }, "components": { - "link_learn_more": "Saber más…", - "list_with_screenshot_alt": "Captura de pantalla de la función seleccionada" + "link_learn_more": "Saber más…" }, "download_now": { "text": "Descarga ahora ", diff --git a/apps/website/public/translations/fa/translation.json b/apps/website/src/translations/fa/translation.json similarity index 100% rename from apps/website/public/translations/fa/translation.json rename to apps/website/src/translations/fa/translation.json diff --git a/apps/website/public/translations/fi/translation.json b/apps/website/src/translations/fi/translation.json similarity index 100% rename from apps/website/public/translations/fi/translation.json rename to apps/website/src/translations/fi/translation.json diff --git a/apps/website/public/translations/fr/translation.json b/apps/website/src/translations/fr/translation.json similarity index 99% rename from apps/website/public/translations/fr/translation.json rename to apps/website/src/translations/fr/translation.json index 0b7fe98bf..b464b2d71 100644 --- a/apps/website/public/translations/fr/translation.json +++ b/apps/website/src/translations/fr/translation.json @@ -74,8 +74,7 @@ "get_started": "Commencer" }, "components": { - "link_learn_more": "En savoir plus...", - "list_with_screenshot_alt": "Capture d'écran de la fonctionnalité sélectionnée" + "link_learn_more": "En savoir plus..." }, "support_us": { "financial_donations_title": "Dons financiers", diff --git a/apps/website/public/translations/hr/translation.json b/apps/website/src/translations/hr/translation.json similarity index 100% rename from apps/website/public/translations/hr/translation.json rename to apps/website/src/translations/hr/translation.json diff --git a/apps/website/public/translations/hu/translation.json b/apps/website/src/translations/hu/translation.json similarity index 100% rename from apps/website/public/translations/hu/translation.json rename to apps/website/src/translations/hu/translation.json diff --git a/apps/website/public/translations/id/translation.json b/apps/website/src/translations/id/translation.json similarity index 100% rename from apps/website/public/translations/id/translation.json rename to apps/website/src/translations/id/translation.json diff --git a/apps/website/public/translations/it/translation.json b/apps/website/src/translations/it/translation.json similarity index 95% rename from apps/website/public/translations/it/translation.json rename to apps/website/src/translations/it/translation.json index 2ffc45a94..03792e5ed 100644 --- a/apps/website/public/translations/it/translation.json +++ b/apps/website/src/translations/it/translation.json @@ -51,7 +51,8 @@ "mermaid_description": "Crea diagrammi come diagrammi di flusso, diagrammi di classe e sequenza, diagrammi di Gantt e molti altri, utilizzando la sintassi Mermaid.", "mindmap_title": "Mappe mentali", "mindmap_description": "Organizza i tuoi pensieri visivamente o fai una sessione di brainstorming.", - "others_list": "e altri: <0>mappa delle note, <1>mappa delle relazioni, <2>ricerche salvate, <3>renderizza nota e <4>visualizzazioni web." + "others_list": "e altri: <0>mappa delle note, <1>mappa delle relazioni, <2>ricerche salvate, <3>renderizza nota e <4>visualizzazioni web.", + "title": "Diversi modi per rappresentare le tue informazioni" }, "extensibility_benefits": { "title": "Condivisione ed estensibilità", @@ -72,7 +73,10 @@ "board_title": "Board", "board_description": "Organizza le tue attività o lo stato dei tuoi progetti in una lavagna Kanban con un modo semplice per creare nuovi elementi e colonne e modificare facilmente il loro stato trascinandoli sulla lavagna.", "geomap_title": "Geomappa", - "geomap_description": "Pianifica le tue vacanze o segna i tuoi punti di interesse direttamente su una mappa geografica utilizzando indicatori personalizzabili. Visualizza le tracce GPX registrate per seguire gli itinerari." + "geomap_description": "Pianifica le tue vacanze o segna i tuoi punti di interesse direttamente su una mappa geografica utilizzando indicatori personalizzabili. Visualizza le tracce GPX registrate per seguire gli itinerari.", + "title": "Collezioni", + "presentation_title": "Presentazione", + "presentation_description": "Organizza le informazioni in diapositive e presentale a schermo intero con transizioni fluide. Le diapositive possono anche essere esportate in formato PDF per una facile condivisione." }, "faq": { "title": "Domande frequenti", @@ -95,8 +99,7 @@ "get_started": "Inizia ora" }, "components": { - "link_learn_more": "Per saperne di più...", - "list_with_screenshot_alt": "Screenshot della funzione selezionata" + "link_learn_more": "Per saperne di più..." }, "download_now": { "text": "Scarica ora ", @@ -188,5 +191,10 @@ "description": "Trilium Notes è ospitato su PikaPods, un servizio a pagamento che consente un facile accesso e una semplice gestione. Non è direttamente affiliato al team Trilium.", "download_pikapod": "Configurazione su PikaPods", "download_triliumcc": "In alternativa, consultare trilium.cc" + }, + "header": { + "get-started": "Inizia", + "documentation": "Documentazione", + "support-us": "Sostienici" } } diff --git a/apps/website/public/translations/ja/translation.json b/apps/website/src/translations/ja/translation.json similarity index 96% rename from apps/website/public/translations/ja/translation.json rename to apps/website/src/translations/ja/translation.json index 96115d80e..d7cb3f599 100644 --- a/apps/website/public/translations/ja/translation.json +++ b/apps/website/src/translations/ja/translation.json @@ -51,7 +51,8 @@ "mermaid_description": "Mermaid 構文を使用して、フローチャート、クラス図、シーケンス図、ガント チャートなどの図を作成します。", "mindmap_title": "マインドマップ", "mindmap_description": "考えを視覚的に整理したり、ブレインストーミング セッションを行ったりします。", - "others_list": "その他: <0>ノートマップ、<1>リレーションマップ、<2>保存された検索、<3>レンダリングノート、<4>Web ビュー。" + "others_list": "その他: <0>ノートマップ、<1>リレーションマップ、<2>保存された検索、<3>レンダリングノート、<4>Web ビュー。", + "title": "情報を表現するための複数の方法" }, "extensibility_benefits": { "title": "共有と拡張性", @@ -72,7 +73,10 @@ "board_title": "ボード", "board_description": "新しい項目や列を簡単に作成し、ボード上でドラッグするだけでステータスを変更できるカンバン ボードで、タスクやプロジェクトのステータスを整理できます。", "geomap_title": "ジオマップ", - "geomap_description": "カスタマイズ可能なマーカーを使って、休暇を計画したり、興味のある場所を地図上に直接マークしたりできます。記録されたGPXトラックを表示して、旅程を追跡できます。" + "geomap_description": "カスタマイズ可能なマーカーを使って、休暇を計画したり、興味のある場所を地図上に直接マークしたりできます。記録されたGPXトラックを表示して、旅程を追跡できます。", + "title": "コレクション", + "presentation_title": "プレゼンテーション", + "presentation_description": "情報をスライドに整理し、スムーズな遷移で全画面表示できます。スライドはPDFにエクスポートできるので、簡単に共有できます。" }, "faq": { "title": "よくある質問", @@ -95,8 +99,7 @@ "get_started": "はじめる" }, "components": { - "link_learn_more": "さらに詳しく...", - "list_with_screenshot_alt": "選択中の機能のスクリーンショット" + "link_learn_more": "さらに詳しく..." }, "download_now": { "text": "今すぐダウンロード ", @@ -188,5 +191,10 @@ "description": "Trilium Notesは、アクセスと管理を容易にする有料サービス PikaPods でホストされています。Trilium チームとは直接関係ありません。", "download_pikapod": "PikaPods にセットアップする", "download_triliumcc": "または、trilium.cc を参照してください" + }, + "header": { + "get-started": "はじめる", + "documentation": "ドキュメント", + "support-us": "サポート" } } diff --git a/apps/website/public/translations/ko/translation.json b/apps/website/src/translations/ko/translation.json similarity index 100% rename from apps/website/public/translations/ko/translation.json rename to apps/website/src/translations/ko/translation.json diff --git a/apps/website/public/translations/md/translation.json b/apps/website/src/translations/md/translation.json similarity index 100% rename from apps/website/public/translations/md/translation.json rename to apps/website/src/translations/md/translation.json diff --git a/apps/website/public/translations/nb-NO/translation.json b/apps/website/src/translations/nb-NO/translation.json similarity index 100% rename from apps/website/public/translations/nb-NO/translation.json rename to apps/website/src/translations/nb-NO/translation.json diff --git a/apps/website/public/translations/nl/translation.json b/apps/website/src/translations/nl/translation.json similarity index 100% rename from apps/website/public/translations/nl/translation.json rename to apps/website/src/translations/nl/translation.json diff --git a/apps/website/public/translations/pl/translation.json b/apps/website/src/translations/pl/translation.json similarity index 99% rename from apps/website/public/translations/pl/translation.json rename to apps/website/src/translations/pl/translation.json index 4d4c5df02..b4ddd8e13 100644 --- a/apps/website/public/translations/pl/translation.json +++ b/apps/website/src/translations/pl/translation.json @@ -95,8 +95,7 @@ "get_started": "Start" }, "components": { - "link_learn_more": "Dowiedz się więcej....", - "list_with_screenshot_alt": "Zrzut ekranu wybranej funkcji" + "link_learn_more": "Dowiedz się więcej...." }, "download_now": { "text": "Pobierz teraz ", diff --git a/apps/website/public/translations/pt-BR/translation.json b/apps/website/src/translations/pt-BR/translation.json similarity index 100% rename from apps/website/public/translations/pt-BR/translation.json rename to apps/website/src/translations/pt-BR/translation.json diff --git a/apps/website/public/translations/pt/translation.json b/apps/website/src/translations/pt/translation.json similarity index 100% rename from apps/website/public/translations/pt/translation.json rename to apps/website/src/translations/pt/translation.json diff --git a/apps/website/public/translations/ro/translation.json b/apps/website/src/translations/ro/translation.json similarity index 98% rename from apps/website/public/translations/ro/translation.json rename to apps/website/src/translations/ro/translation.json index ca836e1a8..5cb462254 100644 --- a/apps/website/public/translations/ro/translation.json +++ b/apps/website/src/translations/ro/translation.json @@ -95,8 +95,7 @@ "get_started": "Începe" }, "components": { - "link_learn_more": "Mai multe detalii...", - "list_with_screenshot_alt": "Captură de ecran a funcției selectate" + "link_learn_more": "Mai multe detalii..." }, "download_now": { "text": "Descărcați acum ", @@ -107,9 +106,9 @@ "more_platforms": "Mai multe platforme și instalarea server-ului" }, "header": { - "get-started": "Primii pași", - "documentation": "Documentație", - "support-us": "Sprijină-ne" + "get-started": "Primii pași", + "documentation": "Documentație", + "support-us": "Sprijină-ne" }, "footer": { "copyright_and_the": " și ", diff --git a/apps/website/public/translations/ru/translation.json b/apps/website/src/translations/ru/translation.json similarity index 100% rename from apps/website/public/translations/ru/translation.json rename to apps/website/src/translations/ru/translation.json diff --git a/apps/website/public/translations/sl/translation.json b/apps/website/src/translations/sl/translation.json similarity index 100% rename from apps/website/public/translations/sl/translation.json rename to apps/website/src/translations/sl/translation.json diff --git a/apps/website/public/translations/sr/translation.json b/apps/website/src/translations/sr/translation.json similarity index 100% rename from apps/website/public/translations/sr/translation.json rename to apps/website/src/translations/sr/translation.json diff --git a/apps/website/public/translations/sv/translation.json b/apps/website/src/translations/sv/translation.json similarity index 100% rename from apps/website/public/translations/sv/translation.json rename to apps/website/src/translations/sv/translation.json diff --git a/apps/website/public/translations/tr/translation.json b/apps/website/src/translations/tr/translation.json similarity index 100% rename from apps/website/public/translations/tr/translation.json rename to apps/website/src/translations/tr/translation.json diff --git a/apps/website/public/translations/uk/translation.json b/apps/website/src/translations/uk/translation.json similarity index 100% rename from apps/website/public/translations/uk/translation.json rename to apps/website/src/translations/uk/translation.json diff --git a/apps/website/public/translations/vi/translation.json b/apps/website/src/translations/vi/translation.json similarity index 100% rename from apps/website/public/translations/vi/translation.json rename to apps/website/src/translations/vi/translation.json diff --git a/apps/website/public/translations/zh-Hans/translation.json b/apps/website/src/translations/zh-Hans/translation.json similarity index 100% rename from apps/website/public/translations/zh-Hans/translation.json rename to apps/website/src/translations/zh-Hans/translation.json diff --git a/apps/website/public/translations/zh-Hant/translation.json b/apps/website/src/translations/zh-Hant/translation.json similarity index 95% rename from apps/website/public/translations/zh-Hant/translation.json rename to apps/website/src/translations/zh-Hant/translation.json index 580c54fba..80929ce94 100644 --- a/apps/website/public/translations/zh-Hant/translation.json +++ b/apps/website/src/translations/zh-Hant/translation.json @@ -51,7 +51,8 @@ "mermaid_description": "使用 Mermaid 語法繪製流程圖、類別圖與序列圖、甘特圖等多種圖表。", "mindmap_title": "心智圖", "mindmap_description": "以視覺方式整理思緒,或進行腦力激盪。", - "others_list": "及其他項目:<0>筆記地圖、<1>關聯地圖、<2>儲存搜尋、<3>渲染筆記,以及<4>網頁檢視。" + "others_list": "及其他項目:<0>筆記地圖、<1>關聯地圖、<2>儲存搜尋、<3>渲染筆記,以及<4>網頁檢視。", + "title": "多種方式呈現您的資訊" }, "extensibility_benefits": { "title": "分享及擴展性", @@ -72,7 +73,10 @@ "board_title": "看板", "board_description": "將您的任務或專案狀態整理成看板,輕鬆建立新項目與欄位,並透過在看板上拖曳即可簡單變更狀態。", "geomap_title": "地理地圖", - "geomap_description": "使用可自訂的標記,直接在地圖上規劃您的假期行程或標記感興趣的地點。顯示已記錄的GPX軌跡,以便追蹤行程路線。" + "geomap_description": "使用可自訂的標記,直接在地圖上規劃您的假期行程或標記感興趣的地點。顯示已記錄的GPX軌跡,以便追蹤行程路線。", + "title": "集合", + "presentation_title": "簡報", + "presentation_description": "將資訊整理成投影片,並以全螢幕模式及流暢的轉場效果呈現。投影片亦可匯出為 PDF 格式,方便分享。" }, "faq": { "title": "常見問題", @@ -95,8 +99,7 @@ "get_started": "上手指南" }, "components": { - "link_learn_more": "了解更多…", - "list_with_screenshot_alt": "已選擇功能的螢幕截圖" + "link_learn_more": "了解更多…" }, "download_now": { "text": "馬上下載 ", @@ -188,5 +191,10 @@ "description": "Trilium Notes 託管於 PikaPods,此為付費服務,提供便捷存取與管理功能。與 Trilium 團隊無直接關聯。", "download_pikapod": "在 PikaPods 上設定", "download_triliumcc": "或參見 trilium.cc" + }, + "header": { + "get-started": "上手指南", + "documentation": "文件", + "support-us": "支持我們" } } diff --git a/apps/website/tsconfig.json b/apps/website/tsconfig.json index 48581e18c..4d67635d7 100644 --- a/apps/website/tsconfig.json +++ b/apps/website/tsconfig.json @@ -9,6 +9,9 @@ "jsx": "react-jsx", "jsxImportSource": "preact", "skipLibCheck": true, + "types": [ + "vite/client" + ], "paths": { "react": ["../../node_modules/preact/compat/"], "react-dom": ["../../node_modules/preact/compat/"]