aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Tools/Tracker
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-05-24 13:22:34 +0000
committerFuwn <[email protected]>2026-05-24 13:22:34 +0000
commit56a7a7851b09cb30a5cd543c8cb4f926109b4290 (patch)
treea620f908405fa48fd601580c5a48432831ec5c33 /src/lib/Tools/Tracker
parentfix(layout): preserve list panel when clicking action buttons in summary (diff)
downloaddue.moe-56a7a7851b09cb30a5cd543c8cb4f926109b4290.tar.xz
due.moe-56a7a7851b09cb30a5cd543c8cb4f926109b4290.zip
refactor(locale): move hardcoded UI strings into english locale
Adds optional namespaces (common, errors, commandPalette, headTitle, notifications, schedule, events, home, reader, routes, badgePreview, badgeWall) and extends existing ones (settings.*, lists.*, tools.*, user.*, hololive.*) on the Locale interface. New fields are optional so japanese.ts can omit them; svelte-i18n's fallbackLocale handles the runtime miss. HeadTitle gains an optional routeKey prop for type-safe lookup. defaultActions becomes a factory so the command palette re-reads locale on language toggle. The existing JP feedback translation in routes/settings is preserved via japanese.ts. Out of scope (kept hardcoded): service-worker.ts, app.html, Landing*.svelte, tools.ts registry, Easter Event 2025 pages.
Diffstat (limited to 'src/lib/Tools/Tracker')
-rw-r--r--src/lib/Tools/Tracker/Tool.svelte34
1 files changed, 24 insertions, 10 deletions
diff --git a/src/lib/Tools/Tracker/Tool.svelte b/src/lib/Tools/Tracker/Tool.svelte
index 8f7a3197..b495522a 100644
--- a/src/lib/Tools/Tracker/Tool.svelte
+++ b/src/lib/Tools/Tracker/Tool.svelte
@@ -4,6 +4,8 @@ import { v6 as uuidv6 } from "uuid";
import { database, type TrackerEntry } from "$lib/Database/IDB/tracker";
import { onMount } from "svelte";
import Message from "$lib/Loading/Message.svelte";
+import locale from "$stores/locale";
+import { get } from "svelte/store";
let url = "";
let title = "";
@@ -34,15 +36,19 @@ const adjustEntry = (id: string, to: number) => {
const addEntry = async (url: string, title: string, progress: number) => {
if (!url || !title) {
- error = "URL and title are required fields";
+ error =
+ get(locale)().tools.tracker?.urlTitleRequired ??
+ "URL and title are required fields";
return;
}
if (listAccess.some((entry) => entry.url === url)) {
- error =
- "Entry with URL already exists: " +
- listAccess.find((entry) => entry.url === url)?.title;
+ const existing = listAccess.find((entry) => entry.url === url)?.title;
+
+ error = (
+ get(locale)().tools.tracker?.entryExists ?? "Entry with URL already exists: {url}"
+ ).replace("{url}", existing ?? "");
return;
}
@@ -55,7 +61,9 @@ const addEntry = async (url: string, title: string, progress: number) => {
const deleteEntry = async (id: string) => {
if (confirmDelete !== 1) {
confirmDelete = 1;
- error = "Click again to confirm deletion";
+ error =
+ get(locale)().tools.tracker?.confirmDelete ??
+ "Click again to confirm deletion";
return;
}
@@ -73,10 +81,16 @@ const deleteEntry = async (id: string) => {
<p><b>Error</b>: {error}</p>
{/if}
- <input type="url" placeholder="URL" bind:value={url} />
- <input type="text" placeholder="Title" bind:value={title} />
- <input type="number" placeholder="Progress (defaults to 0)" bind:value={progress} />
- <button class="button-lined" onclick={() => addEntry(url, title, progress)}> Add </button>
+ <input type="url" placeholder={$locale().tools.tracker?.urlPlaceholder} bind:value={url} />
+ <input type="text" placeholder={$locale().tools.tracker?.titlePlaceholder} bind:value={title} />
+ <input
+ type="number"
+ placeholder={$locale().tools.tracker?.progressPlaceholder}
+ bind:value={progress}
+ />
+ <button class="button-lined" onclick={() => addEntry(url, title, progress)}
+ >{$locale().common?.add}</button
+ >
<Spacer />
@@ -120,7 +134,7 @@ const deleteEntry = async (id: string) => {
+
</button>
<span class="opaque">|</span>
- <button onclick={() => deleteEntry(entry.id)}>Remove</button>
+ <button onclick={() => deleteEntry(entry.id)}>{$locale().common?.remove}</button>
</span>
</div>
</li>