- Unify 資料庫適配器 -> 資料庫轉接器 across 6 entries so the database
adapter setting uses one term throughout the catalogue.
- Drop the calqued "透過⋯⋯來⋯⋯" construction in 3 entries (Testing-only
conflict resolution, the P2P replicator description, and the
duplicated garbage-collection cleanup description); the sentences
read the same without the borrowed English "by X to Y" shape.
- Rename the Eden-chunk "Incubate" feature's label from 孵化 (hatch) to
暫存 (temporarily store) across 7 entries, matching the wording
already used in the toggle's own description and avoiding a
half-metaphor/half-literal split within the same feature.
- Convert the ASCII ellipsis "..." to the full-width "⋯" in 22
in-progress/loading strings, per Taiwanese typography convention;
the English source keys (which legitimately end in "...") are
untouched.
- Reword "Fetch database with previous behaviour" to avoid a 以前/以
+ 前一種 parsing ambiguity, matching the 先前的行為 wording already
used by the sibling 保留先前的行為 entry.
- Drop the orphaned closing paren in errMaxDocumentSize/errMaxRequestSize,
fixing a display defect inherited from the English source.
- Add 同步 to beforeLiveSync for clarity.
Regenerated messagesJson/zh-tw.json and combinedMessages.prod.ts via
`npm run i18n:bake`; no other locale's entries changed.
Verified with tsc-check, lint, lint:community, lint:community:tools,
svelte-check, build, check:compatibility, and test:unit (630 tests,
88 files) — all pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Continues the zh-tw work from commit 0f50f290, which only translated the
190 keys `$msg()` calls in `src/` resolved through the catalogue at the
time. This closes the remaining gap: 573 of 1450 keys (39.5%) to 1446 of
1450 (99.7%), matching es (99.9%) and comfortably ahead of every other
locale except it.
While re-scanning to find the next batch, the earlier "code-referenced"
count turned out to be wrong: the previous grep only matched single-line
`$msg("literal")` calls and missed multi-line calls and the `msg`, `_msg`,
and `translateMessage` aliases various Svelte components import (e.g.
`import { $msg as msg } from "@/common/translation"`). A corrected scan
found 624 referenced keys, not 309, of which 350 were still untranslated —
mostly the P2P Sync status panes and several SetupWizard dialogues. Since
this pass translates everything remaining regardless of reference status,
that gap closes as a side effect; it is called out here only because it
explains why some of the newly translated strings are already visible in
today's UI rather than being pure catalogue completeness.
- Translated by area: P2P Sync replicator panes and the `P2P.*` runtime
messages; ConfigSync's plugin/snippet/theme comparison UI; the
SetupWizard's remote-setup, rebuild/fetch, and outro dialogues (both the
legacy flat-key strings and the newer `Ui.SetupWizard.*` Svelte
component keys); the Svelte-based `Ui.Settings.*` settings panels
(Maintenance, Patches, Hatch, Remote, Common, Selector, PowerUsers,
CustomisationSync, Advanced, Setup, SyncSettings); Setting Doctor
(`Doctor.*`); the remote-size warning flow (`moduleCheckRemoteSize.*`);
the redflag3 fetch-method chooser (`RedFlag.*`); the remaining
`moduleMigration.*`, `liveSyncReplicator.*`, `Replicator.*`, and
`TweakMismatchResolve.*` entries; and the rest of the plain
English-sentence keys, including the language-picker's native-script
entries (added `lang-he: עברית`, matching how `lang-de`/`lang-ja`/etc.
already show each language's own name rather than a Chinese gloss).
- Wording follows docs/terms.md and the register already established in
this file: `Setup URI`, `Vault`, `chunk(s)`, `Peer`, `Peer-to-Peer`,
`Hatch`, and `CouchDB` stay untranslated as proper nouns; `resolved`
(device/database state) is consistently 已處理, matching the existing
Scram-dialogue usage.
- `${...}` placeholders and `%{...}` keyword references are kept
byte-identical to the English source, including the multi-paragraph
`RedFlag.Fetch.Method.Desc` and `moduleCheckRemoteSize.msgDatabaseGrowing`
callout blocks; verified programmatically against all 1446 zh-tw
entries.
- 4 keys are still deliberately left untranslated, unchanged from the
previous commit: `moduleMigration.docUri` and
`obsidianLiveSyncSettingTab.linkTroubleshooting` are a URL and a doc
path, `obsidianLiveSyncSettingTab.logServerConfigurationCheck`'s English
value is the key name itself, and `moduleLiveSyncMain.logPluginVersion`
is a version-number template.
- Regenerated `messagesJson/zh-tw.json` and `combinedMessages.prod.ts`
through the documented `i18n:bake` pipeline; no other language's
entries changed.
Verified with tsc-check, tsc-check:apps, lint, lint:community,
lint:community:tools, svelte-check, check:compatibility, and test:unit
(604 tests, 86 files) — all pass.
Not in scope, unchanged from the previous commit: the ~137 Commonlib-owned
setting labels/descriptions never reach any translator because
`getConfig()` call sites in SettingDialogue omit the `translate` argument;
German is staged in the catalogue but never imported by
`combinedMessages.dev.ts`; Hebrew keyword references are never expanded by
`expandKeywords()`. None of these are specific to zh-tw and none are
touched here.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The zh-tw catalogue was the weakest of the ten supported locales at 380 of
1450 keys (26%), well behind zh (75%) and ja (57%). Users who select
繁體中文 saw English for most of the interface.
This does not attempt full parity. It closes the gap for the 190 keys that
`$msg()` calls in `src/` actually resolve through the catalogue (zh-tw had
no entry for any of them), plus the 7 `K.*` keyword fragments that
`expandKeywords()` substitutes into `%{...}` references at build time
(zh-tw had none of these either, so any zh-tw message referencing `%{Peer}`
etc. would have shown the raw token on screen — the same defect currently
affecting `he`).
- 186 of the 190 code-referenced keys are translated. The remaining 4 are
left as-is because their English value is not translatable prose:
`moduleMigration.docUri` and `obsidianLiveSyncSettingTab.linkTroubleshooting`
are a URL and a doc path, `obsidianLiveSyncSettingTab.logServerConfigurationCheck`'s
English value is the key name itself, and `moduleLiveSyncMain.logPluginVersion`
is a version-number template.
- Two pre-existing entries are corrected for internal consistency: `Bucket
Name` (儲存桶→儲存庫) and `Peer-to-Peer Synchronisation` (點對點同步→
Peer-to-Peer 同步), the latter matching the other three occurrences of
"Peer-to-Peer" already left untranslated in this same file.
- Wording follows docs/terms.md and the existing zh-tw register: `Setup
URI`, `Vault`, `chunk(s)`, `Hatch`, and `Peer-to-Peer` stay untranslated
as proper nouns, matching how the rest of the file already treats them.
- `${...}` placeholders and `%{...}` keyword references are kept
byte-identical to the English source; verified programmatically against
all 573 zh-tw entries, not just the new ones.
- Regenerated `messagesJson/zh-tw.json` and `combinedMessages.prod.ts`
through the documented `i18n:bake` pipeline; no other language's entries
changed.
Coverage: 380/1450 (26.2%) -> 573/1450 (39.5%).
Verified with tsc-check, tsc-check:apps, lint, lint:community,
lint:community:tools, svelte-check, check:compatibility, and test:unit
(604 tests, 86 files) — all pass.
Not in scope, left for follow-up: the ~137 Commonlib-owned setting
labels/descriptions never reach any translator because `getConfig()` call
sites in SettingDialogue omit the `translate` argument; German is staged
in the catalogue but never imported by `combinedMessages.dev.ts`; Hebrew
keyword references are never expanded by `expandKeywords()`. None of these
are specific to zh-tw and none are touched here.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Use typed Commonlib outcomes to guide Fetch and Rebuild without treating a new remote as a failed read. Preserve automatic synchronisation choices when scheduled initialisation is cancelled.
Fill in the 318 remaining untranslated message keys for Korean, bringing
`ko` from 1132/1450 to 1450/1450 against the English base locale.
The gap was concentrated in recently added areas: P2P synchronisation UI,
the setup wizard confirmation dialogues, S3/MinIO/R2 and JWT authentication
settings, and the diagnostics/maintenance panels. These keys are looked up
by their English source text, so an absent translation silently fell back
to English.
Terminology follows the existing Korean resource: Vault as 보관함, chunk as
청크, passphrase as 패스프레이즈, replication as 복제, rebuild as 재구축.
Proper nouns (CouchDB, LiveSync, Setup URI, JWT, TURN) are left as-is.
Sentence fragments that are concatenated in the setup wizard were adapted
to Korean word order — Korean places the predicate last, so the emphasised
trailing fragment carries the verb (e.g. "the single, authoritative master
copy" renders as a complete predicate).
Only ko.yaml was hand-edited; ko.json and combinedMessages.prod.ts are
regenerated by `npm run i18n:bake`.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R5avHoUL5zBwBfakGHyeFz
Fills every untranslated key in the Spanish catalogue: coverage goes from
643/1132 to 1131/1132 against `en.yaml`.
- Translate the 488 keys that had no Spanish entry, covering the Config
Doctor, tweak-mismatch resolution, the P2P notes and panes, the Setup
Wizard, the maintenance and patch panels, Garbage Collection V3 and the
migration dialogues.
- Register follows the existing catalogue: informal address, `es-ES`
vocabulary, British-style source wording preserved where it is a proper
noun (Setup URI, Vault, chunk).
- Placeholders (`${...}`), keyword references (`%{...}`) and Markdown
callout syntax are kept byte-identical to the English source.
- Regenerate `messagesJson/es.json` and `combinedMessages.prod.ts` with the
documented `i18n:bake` pipeline.
`obsidianLiveSyncSettingTab.logServerConfigurationCheck` is deliberately left
untranslated: its English value is the key itself, so it looks like a
placeholder rather than a message.
Regenerating the catalogue also normalises three pre-existing entries each in
`ko.json` and `zh.json`, where the committed JSON kept a trailing space before
a newline that YAML cannot represent.
Verified with tsc-check and test:unit.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Continues the source-key migration inside the application boundary introduced
in 1.0.0, where LiveSync owns its catalogue and consumes Commonlib as a
published package.
- Replace hardcoded user-visible strings in the Obsidian UI (Setup Wizard
dialogues, P2P panes, Customisation Sync panes, Global History, the JSON
conflict pane and the remote-configuration menu) with `$msg` calls, keeping
the English source string as the key.
- Wire up strings whose translations already existed in the catalogue but were
still rendered as literals, for example the whole Intro dialogue.
- Add the new entries to `src/common/messagesYAML/en.yaml` and `es.yaml`, then
regenerate `messagesJson/` and `combinedMessages.prod.ts` through the
documented `i18n:bake` pipeline.
- No Commonlib gitlink or catalogue is involved; every change is
LiveSync-owned.
Regenerating the catalogue also normalises three pre-existing entries each in
`ko.json` and `zh.json`, where the committed JSON kept a trailing space before
a newline that YAML cannot represent.
Verified with tsc-check, tsc-check:apps, svelte-check and lint.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Korean coverage was 796 of 1132 keys (70%), so a large part of the UI fell
back to English. Alongside the missing entries, the existing translations
carried a few defects that were visible to users.
Fixes:
- Three messages had lost the `$` from their placeholders, leaving a literal
`{origin}`, `{org}` and `{from}->{to}` on screen, because `$msg()` only
substitutes `${...}`.
- `dialog.yourLanguageAvailable` referenced `%{Display language}`, but the key
is `Display Language`, so the raw token was shown. Corrected to match ja.
- Sixteen onboarding messages ended with the Japanese full stop `。`.
- Four messages hard-coded a particle after a variable (`${measuredSize}가`),
which is ungrammatical for values ending in a consonant. They now use the
paired form `이(가)`, `을(를)`, `(으)로`.
Terminology is now consistent with the Obsidian Korean UI and with the
definitions in docs/terms.md:
- `vault` is 보관함, `device` is 기기, `status bar` is 상태 표시줄.
- `chunk` is 청크 everywhere; the Eden settings had rendered it as 변경 기록
("change record"), which is not what a chunk is.
- `Compaction` is 압축 정리, separating it from `Data Compression` (데이터 압축),
which had shared the same word.
- HTTP `Origin` is 출처; it had been 원점, the geometric origin.
- Six English strings that had mapped to two different Korean strings each are
now unified.
The remaining 336 keys are translated, including the setup wizard outro, the
insecure-chunk and v0.25.6 recovery dialogues, and the database adapter
migration messages.
This ports vrtmrz/livesync-commonlib#79 to this repository, following the
v1.0.0 boundary change that moved application translations here. On top of
the original work, the 17 keys newly introduced in v1.0.0 (the P2P setup
wizard Invitation, OutroNewP2PUser and RebuildEverythingP2P dialogues, and
the moduleCheckRemoteSize notices) are translated as well.
Verified with _tools/checkI18nCoverage.ts (ko: 1132/1132, 0 missing),
tsc --noEmit, and a dev build. Generated resources are committed as produced
by `npm run i18n:bake`; besides the `ko` entries it also trims a stale
trailing space from five es/zh entries in combinedMessages.prod.ts that had
been left behind by the migration.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EtFsro96LHztmoYmRjtfAy
Keep unresolved conflicts visible after Not now, reopen them only on explicit requests, and clear stale warning and dialogue state when a replicated resolution arrives. Add typed provisional English messages, revision-tree regressions, specifications, and a focused Real Obsidian E2E.
- Now the `report` includes recent logs (of verbosity `verbose` even settings is not set to `verbose`).
- Updating logs is now debounced to avoid excessive updates during rapid log generation.
- Added a `Generate full report for opening the issue with debug info` command to the command palette, which generates a report without opening the settings dialogue.
When couchDB_URI ends with a trailing slash (e.g. https://host/), the
database name concatenation produces a double-slash path
(https://host//obsidiannotes), which causes CouchDB to reject requests
with 401 "Name or password is incorrect".
Strip trailing slashes from couchDB_URI / baseUri at the path
concatenation sites in:
- src/common/utils.ts (_requestToCouchDBFetch, _requestToCouchDB)
- src/features/LocalDatabaseMainte/CmdLocalDatabaseMainte.ts
The companion fix for the replication path is in the livesync-commonlib
submodule.
Ref: #859
Now, Self-hosted LiveSync has finally begun to be split into the Self-hosted LiveSync plugin for Obsidian, and a properly abstracted version of it.
This may not offer much benefit to Obsidian plugin users, or might even cause a slight inconvenience, but I believe it will certainly help improve testability and make the ecosystem better.
However, I do not see the point in putting something with little benefit into beta, so I am handling this on the alpha branch. I would actually preferred to create an R&D branch, but I was not keen on the ampersand, and I feel it will eventually become a proper beta anyway.
### Refactored
- Separated `ObsidianLiveSyncPlugin` into `ObsidianLiveSyncPlugin` and `LiveSyncBaseCore`.
- Now `LiveSyncCore` indicates the type specified version of `LiveSyncBaseCore`.
- Referencing `plugin.xxx` has been rewritten to referencing the corresponding service or `core.xxx`.
### Internal API changes
- Storage Access APIs are now yielding Promises. This is to allow more limited storage platforms to be supported.
### R&D
- Browser-version of Self-hosted LiveSync is now in development. This is not intended for public use now, but I will eventually make it available for testing.
- We can see the code in `src/apps/webapp` for the browser version.