Initial public release: TriliumNext Korean translation (1,995 strings) + language-list patch script
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
# TriliumNext Notes — Korean (한국어) Translation
|
||||
|
||||
Unofficial, community-made Korean translation for [TriliumNext Notes](https://github.com/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 compiled `main.cjs` server bundle to register
|
||||
`ko` as 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
|
||||
|
||||
1. 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.json`
|
||||
- `server.json` → `/usr/src/app/assets/translations/ko/server.json`
|
||||
2. Extract the container's unpatched `main.cjs` and run the patch script against it:
|
||||
```bash
|
||||
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
|
||||
```
|
||||
3. Bind-mount the patched `main.cjs` over the original in `docker-compose.yml`:
|
||||
```yaml
|
||||
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
|
||||
```
|
||||
4. 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.
|
||||
Reference in New Issue
Block a user