From 56a7a7851b09cb30a5cd543c8cb4f926109b4290 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sun, 24 May 2026 13:22:34 +0000 Subject: 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. --- src/lib/Tools/Wrapped/Tool.svelte | 141 +++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 61 deletions(-) (limited to 'src/lib/Tools/Wrapped') diff --git a/src/lib/Tools/Wrapped/Tool.svelte b/src/lib/Tools/Wrapped/Tool.svelte index b04bc5f6..b7d67cb0 100644 --- a/src/lib/Tools/Wrapped/Tool.svelte +++ b/src/lib/Tools/Wrapped/Tool.svelte @@ -2,6 +2,7 @@ import Spacer from "$lib/Layout/Spacer.svelte"; import "./wrapped.css"; import userIdentity from "$stores/identity"; +import locale from "$stores/locale"; import type { AniListAuthorisation } from "$lib/Data/AniList/identity"; import { onMount } from "svelte"; import { @@ -214,33 +215,36 @@ $: { updateWidth(); } $: genreTagTitle = (() => { + const w = $locale().tools.wrapped; switch (genreTagsSort) { case SortOptions.SCORE: - return "Highest Rated"; + return w?.highestRated ?? "Highest Rated"; case SortOptions.MINUTES_WATCHED: - return "Most Watched"; + return w?.mostWatched ?? "Most Watched"; case SortOptions.COUNT: - return "Most Common"; + return w?.mostCommon ?? "Most Common"; } })(); $: animeMostTitle = (() => { + const w = $locale().tools.wrapped; switch (mediaSort) { case SortOptions.SCORE: - return "Highest Rated"; + return w?.highestRated ?? "Highest Rated"; case SortOptions.MINUTES_WATCHED: - return "Most Watched"; + return w?.mostWatched ?? "Most Watched"; case SortOptions.COUNT: - return "Most Common"; + return w?.mostCommon ?? "Most Common"; } })(); $: mangaMostTitle = (() => { + const w = $locale().tools.wrapped; switch (mediaSort) { case SortOptions.SCORE: - return "Highest Rated"; + return w?.highestRated ?? "Highest Rated"; case SortOptions.MINUTES_WATCHED: - return "Most Read"; + return w?.mostRead ?? "Most Read"; case SortOptions.COUNT: - return "Most Common"; + return w?.mostCommon ?? "Most Common"; } })(); @@ -829,12 +833,12 @@ const pruneFullYear = async () => { {#if shouldFetchData} {#key fetchKey} {#await selectedYear !== currentYear || useFullActivityHistory || new Date().getMonth() <= 6 ? fullActivityHistory(user, $userIdentity, selectedYear, disableLoopingActivityCounter) : getActivityHistory($userIdentity)} - + {:then activities} {#await wrapped(user, $userIdentity, selectedYear, false, disableLoopingActivityCounter)} - + {:then wrapped} @@ -920,9 +924,8 @@ const pruneFullYear = async () => { > {#if useFullActivityHistory}

- With many activities, it may take multiple attempts to obtain all of your activity - history from AniList. If this occurs, wait one minute and try again to continue populating - your local activity history database. + {$locale().tools.wrapped?.multiAttemptPrefix}many{$locale().tools.wrapped + ?.multiAttemptSuffix}

{/if} @@ -970,7 +973,7 @@ const pruneFullYear = async () => { id="watermark" data-umami-event="Load Wrapped Data" > - Click load data! + {$locale().tools.wrapped?.clickLoadData} @@ -985,7 +988,7 @@ const pruneFullYear = async () => {
- Click on the image to download, or right click and select "Save Image As...". + {$locale().tools.wrapped?.saveImageInstruction}
{/if} @@ -995,66 +998,73 @@ const pruneFullYear = async () => { {/if}
- + {#if !shouldFetchData} - + {:else if needsRefetch} {/if}
- Display + {$locale().tools.wrapped?.display} - Show watermark
- Enable background transparency
+ + {$locale().tools.wrapped?.showWatermark}
+ + {$locale().tools.wrapped?.bgTransparency}
- Enable light mode
+ {$locale().tools.wrapped?.lightMode}
- Show top genres and tags
+ {$locale().tools.wrapped?.showGenresTags}
- Hide activity history
- Show highest rated - media percentages
- Show highest rated - genre and tag percentages
- Show ongoing - media from previous years
+ {$locale().tools.wrapped?.hideActivityHistory}
+ + {$locale().tools.wrapped?.showRatedPercentages}
+ + {$locale().tools.wrapped?.showGenreTagPercentages}
+ + {$locale().tools.wrapped?.showOngoingPrevious}
- Activity history position
+ {$locale().tools.wrapped?.activityHistoryPosition}
- Highest rated media count
+ {$locale().tools.wrapped?.highestRatedCount}
- Highest genre and tag count
- + {$locale().tools.wrapped?.highestGenreTagCount}
+ - Width adjustment
+ {$locale().tools.wrapped?.widthAdjustment}
- Calculation + {$locale().tools.wrapped?.calculation} - Enable full-year activity{$locale().tools.wrapped?.refreshData}
- Calculate for year
+ {$locale().tools.wrapped?.calculateForYear}
{ update(); }} /> - Start date filter
+ {$locale().tools.wrapped?.startDateFilter}
{ update(); }} /> - End date filter
+ {$locale().tools.wrapped?.endDateFilter}
- Anime and manga sort
+ {$locale().tools.wrapped?.animeMangaSort}
- Genre and tag sort
- Include music
- Include rewatches & rereads
- Include specials
- Include OVAs
- Include movies
- Excluded unrated & - unwatched
+ {$locale().tools.wrapped?.genreTagSort}
+ + {$locale().tools.wrapped?.includeMusic}
+ + {$locale().tools.wrapped?.includeRewatches}
+ + {$locale().tools.wrapped?.includeSpecials}
+ + {$locale().tools.wrapped?.includeOvas}
+ + {$locale().tools.wrapped?.includeMovies}
+ + {$locale().tools.wrapped?.excludeUnrated}
{ e.key === 'Enter' && submitExcludedKeywords(); }} /> - Excluded keywords -
- Comma separated list (e.g., "My Hero, Kaguya") + {$locale().tools.wrapped?.excludedHint}
- Advanced + {$locale().tools.wrapped?.advanced} - Disable detailed activity information + {$locale().tools.wrapped?.disableDetailedActivity}
{:else} - + {/if} -- cgit v1.2.3