TriliumNext Notes — Korean (한국어) Translation
Unofficial, community-made Korean translation for TriliumNext Notes.
As of this writing, TriliumNext ships with no Korean language pack, and the list of
selectable UI languages is hardcoded into the compiled server bundle rather than
derived from the translations/ folder — so dropping these files in alone is not
enough to make "한국어" show up in the language picker. See below for the full setup.
translation.json— client-side UI strings, 1,712 keys, 100% translated.server.json— server-side strings, 283 keys, 100% translated.patch_main_cjs.js— patches the compiledmain.cjsserver bundle to registerkoas a selectable language (see comments in the script for why this is needed).
Tested against triliumnext/notes:latest (build date 2025-06-07, appVersion 0.95.0).
Variable names inside main.cjs are minified and not stable across builds — if
patch_main_cjs.js prints [skip] on a newer image, the markers it searches for
have changed and need to be re-derived from that build.
Setup
- Copy the translation files into the running container (or better, bind-mount them
so they survive
docker compose down && up— see "Important" below):translation.json→/usr/src/app/public/translations/ko/translation.jsonserver.json→/usr/src/app/assets/translations/ko/server.json
- Extract the container's unpatched
main.cjsand run the patch script against it:docker create --name trilium-tmp triliumnext/notes:latest docker cp trilium-tmp:/usr/src/app/main.cjs ./main.cjs docker rm trilium-tmp node patch_main_cjs.js ./main.cjs node --check ./main.cjs # always verify syntax before deploying - Bind-mount the patched
main.cjsover the original indocker-compose.yml:services: trilium: image: triliumnext/notes:latest volumes: - ./data:/home/node/trilium-data - ./main.cjs:/usr/src/app/main.cjs:ro - ./translation.json:/usr/src/app/public/translations/ko/translation.json:ro - ./server.json:/usr/src/app/assets/translations/ko/server.json:ro - Start the container, then in the app go to Options → Localization and select "한국어".
Important: don't docker cp and stop there
Files copied into a container with docker cp live only in its writable layer —
they disappear the moment the container is recreated (docker compose down && up,
not just restart). Always bind-mount the three files above from the host, as shown
in step 3, or the translation will silently vanish on the next redeploy while the
language list (which lives inside the bind-mounted main.cjs) keeps working —
producing a confusing partial-translation state that has nothing to do with locale
or browser and everything to do with a missing file on the server.
Known gap: CKEditor's own toolbar
CKEditor5's own UI strings (toolbar button labels like "Paragraph", "Heading 2",
"Bold") come from a separate translation system (window.CKEDITOR_TRANSLATIONS)
that isn't touched by this project. As of the tested build, no language —
not German, French, Spanish, Chinese, or any other already-"supported" language —
ships a real CKEditor dictionary either; it falls back to English UI for everyone.
This is a pre-existing gap in the upstream build, not something specific to Korean.
License
Same license as TriliumNext Notes itself. No warranty — this patches a compiled binary by string-matching minified variable names, which is inherently fragile across version upgrades.