refactor(i18n): route remaining Obsidian UI text through the message catalogue

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>
This commit is contained in:
Zeedif
2026-07-30 18:59:19 -06:00
co-authored by Claude Opus 5
parent c385bd7ce7
commit b6746be73e
37 changed files with 3624 additions and 499 deletions
@@ -7,6 +7,7 @@
import { DocumentHistoryModal } from "@/modules/features/DocumentHistory/DocumentHistoryModal.ts";
import { isPlainText, stripAllPrefixes } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/path";
import type { LiveSyncBaseCore } from "@/LiveSyncBaseCore.ts";
import { $msg as translateMessage } from "@/common/translation";
export let plugin: ObsidianLiveSyncPlugin;
export let core: LiveSyncBaseCore;
@@ -207,29 +208,35 @@
<div class="row"><label for="">To:</label><input type="date" bind:value={dispDateTo} disabled={loading} /></div>
<div class="row">
<label for="">Info:</label>
<label><input type="checkbox" bind:checked={showDiffInfo} disabled={loading} /><span>Diff</span></label>
<label
><input type="checkbox" bind:checked={showChunkCorrected} disabled={loading} /><span>Chunks</span
><input type="checkbox" bind:checked={showDiffInfo} disabled={loading} /><span
>{translateMessage("Diff")}</span
></label
>
<label
><input type="checkbox" bind:checked={checkStorageDiff} disabled={loading} /><span>File integrity</span
><input type="checkbox" bind:checked={showChunkCorrected} disabled={loading} /><span
>{translateMessage("Chunks")}</span
></label
>
<label
><input type="checkbox" bind:checked={checkStorageDiff} disabled={loading} /><span
>{translateMessage("File integrity")}</span
></label
>
</div>
</div>
{#if loading}
<div class="">Gathering information...</div>
<div class="">{translateMessage("Gathering information...")}</div>
{/if}
<table>
<tbody>
<tr>
<th> Date </th>
<th> Path </th>
<th> Rev </th>
<th> Stat </th>
<th> {translateMessage("Date")} </th>
<th> {translateMessage("Path")} </th>
<th> {translateMessage("Rev")} </th>
<th> {translateMessage("Stat")} </th>
{#if showChunkCorrected}
<th> Chunks </th>
<th> {translateMessage("Chunks")} </th>
{/if}
</tr>
<tr>
@@ -237,7 +244,7 @@
{#if loading}
<div class=""></div>
{:else}
<div><button on:click={() => nextWeek()}>+1 week</button></div>
<div><button on:click={() => nextWeek()}>{translateMessage("+1 week")}</button></div>
{/if}
</td>
</tr>
@@ -286,7 +293,7 @@
{#if loading}
<div class=""></div>
{:else}
<div><button on:click={() => prevWeek()}>+1 week</button></div>
<div><button on:click={() => prevWeek()}>{translateMessage("+1 week")}</button></div>
{/if}
</td>
</tr>