web: de-brand PhotoPrism references in user-facing copy

Replaces "PhotoPrism" in UI strings (empty states, tooltips, toasts,
log header, login screen) with neutral terms like "the indexer", "the
library", "the server" — accurate regardless of backend. The login
header becomes "Mulimage" and drops the explicit PhotoPrism mention.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 00:43:56 +02:00
parent e364e4128f
commit 24dfa996b3
9 changed files with 22 additions and 22 deletions

View File

@@ -333,7 +333,7 @@ export function gridKeyNav(node: HTMLElement, params: GridKeyNavParams = {}) {
// truth. // truth.
if (added.length === 0) { if (added.length === 0) {
toast.error(`Nothing added to ${heap.Title}`, { toast.error(`Nothing added to ${heap.Title}`, {
description: `PhotoPrism rejected all ${ids.length} UIDs (already in heap, or not indexed).` description: `The server rejected all ${ids.length} UIDs (already in heap, or not indexed).`
}); });
return; return;
} }

View File

@@ -158,7 +158,7 @@
`Archived ${result.moved.length} duplicate${result.moved.length === 1 ? '' : 's'}`, `Archived ${result.moved.length} duplicate${result.moved.length === 1 ? '' : 's'}`,
{ {
description: losingIndexed description: losingIndexed
? 'The previously-indexed copy was moved; PhotoPrism will drop it on the next index pass.' ? 'The previously-indexed copy was moved; the indexer will drop it on the next index pass.'
: 'Files moved to .duplicates/ inside originals.' : 'Files moved to .duplicates/ inside originals.'
} }
); );
@@ -246,7 +246,7 @@
{#if isIndexed} {#if isIndexed}
<span <span
class="absolute right-1.5 top-1.5 rounded bg-emerald-600 px-1.5 py-0.5 text-[10px] font-semibold text-white" class="absolute right-1.5 top-1.5 rounded bg-emerald-600 px-1.5 py-0.5 text-[10px] font-semibold text-white"
title="Currently indexed by PhotoPrism" title="Currently in the library"
> >
Indexed Indexed
</span> </span>

View File

@@ -89,9 +89,9 @@
<EmptyState icon={Copy} title="No stacks"> <EmptyState icon={Copy} title="No stacks">
{#snippet descriptionSnippet()} {#snippet descriptionSnippet()}
<p> <p>
PhotoPrism stacks byte-identical (or EXIF-identical) files. If you don't have The library stacks byte-identical (or EXIF-identical) files. If you don't have
any, this tab stays empty. Cross-folder copies PhotoPrism rejected at index any, this tab stays empty. Cross-folder copies dropped at index time live under
time live under the Cross-folder tab. the Cross-folder tab.
</p> </p>
{/snippet} {/snippet}
</EmptyState> </EmptyState>
@@ -110,7 +110,7 @@
<div role="tabpanel" aria-label="Cross-folder duplicates" class="space-y-3 px-6 py-4 pb-6"> <div role="tabpanel" aria-label="Cross-folder duplicates" class="space-y-3 px-6 py-4 pb-6">
<header class="flex items-baseline justify-between gap-3"> <header class="flex items-baseline justify-between gap-3">
<p class="text-[11px] text-muted-foreground"> <p class="text-[11px] text-muted-foreground">
Byte-identical files PhotoPrism dropped at index time. Found by scanning the Byte-identical files the indexer dropped at index time. Found by scanning the
originals tree directly. originals tree directly.
</p> </p>
<button <button

View File

@@ -142,7 +142,7 @@
Library settings Library settings
</Dialog.Title> </Dialog.Title>
<Dialog.Description class="mt-1 text-xs text-muted-foreground"> <Dialog.Description class="mt-1 text-xs text-muted-foreground">
Drive PhotoPrism's library, indexer, importer and server log. Drive the library, indexer, importer and server log.
</Dialog.Description> </Dialog.Description>
</div> </div>
<Dialog.Close <Dialog.Close
@@ -403,8 +403,8 @@
<Tabs.Content value="logs" class="space-y-2 text-[12px] outline-none"> <Tabs.Content value="logs" class="space-y-2 text-[12px] outline-none">
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<p class="text-muted-foreground"> <p class="text-muted-foreground">
Most recent PhotoPrism errors and warnings. Auto-refreshes Most recent server errors and warnings. Auto-refreshes every
every 5 seconds. 5 seconds.
</p> </p>
<button <button
type="button" type="button"

View File

@@ -174,7 +174,7 @@
// a no-op. // a no-op.
if (added.length === 0) { if (added.length === 0) {
toast.error(`Nothing added to ${heap.Title}`, { toast.error(`Nothing added to ${heap.Title}`, {
description: `PhotoPrism rejected all ${ids.length} UIDs (already in heap, or not indexed).` description: `The server rejected all ${ids.length} UIDs (already in heap, or not indexed).`
}); });
return; return;
} }

View File

@@ -53,7 +53,7 @@ export const CAUSES: Record<CauseKey, CauseMeta> = {
title: 'Implausible year', title: 'Implausible year',
chip: 'bad year', chip: 'bad year',
suggestion: suggestion:
"Filenames suggest a date PhotoPrism doesn't trust. Open one to set the real TakenAt, then bulk-approve the rest.", "Filenames suggest a date the indexer doesn't trust. Open one to set the real TakenAt, then bulk-approve the rest.",
suggestedAction: 'manual' suggestedAction: 'manual'
}, },
non_image_type: { non_image_type: {
@@ -66,7 +66,7 @@ export const CAUSES: Record<CauseKey, CauseMeta> = {
title: 'Other quality issues', title: 'Other quality issues',
chip: 'low quality', chip: 'low quality',
suggestion: suggestion:
'PhotoPrism flagged these but the metadata looks fine. Open the first one to investigate.', 'The indexer flagged these but the metadata looks fine. Open the first one to investigate.',
suggestedAction: 'manual' suggestedAction: 'manual'
} }
}; };

View File

@@ -856,13 +856,13 @@
<EmptyState <EmptyState
icon={Sparkles} icon={Sparkles}
title="Nothing left to review" title="Nothing left to review"
description="Photos PhotoPrism's indexer wasn't sure about land here — use Keep to accept them into the timeline or Archive to set them aside." description="Photos the indexer wasn't sure about land here — use Keep to accept them into the timeline or Archive to set them aside."
/> />
{:else if filters.section === "hidden"} {:else if filters.section === "hidden"}
<EmptyState <EmptyState
icon={EyeOff} icon={EyeOff}
title="No hidden photos" title="No hidden photos"
description="PhotoPrism auto-hides files it can't index (broken files, very low quality); they only ever show up here." description="The indexer auto-hides files it can't read (broken files, very low quality); they only ever show up here."
/> />
{:else if filters.section === "heap"} {:else if filters.section === "heap"}
<EmptyState <EmptyState
@@ -874,7 +874,7 @@
<EmptyState <EmptyState
icon={ImageOff} icon={ImageOff}
title="No photos" title="No photos"
description="Index a folder via PhotoPrism's reindex command." description="Index a folder from Settings → Index, or run a reindex from the server."
/> />
{/if} {/if}
{:else} {:else}

View File

@@ -61,8 +61,8 @@
class="w-full max-w-sm space-y-5 rounded-lg border border-border bg-card p-8 shadow-sm" class="w-full max-w-sm space-y-5 rounded-lg border border-border bg-card p-8 shadow-sm"
> >
<header class="space-y-1"> <header class="space-y-1">
<h1 class="text-2xl font-semibold tracking-tight text-foreground">Mule</h1> <h1 class="text-2xl font-semibold tracking-tight text-foreground">Mulimage</h1>
<p class="text-sm text-muted-foreground">Sign in with your PhotoPrism account.</p> <p class="text-sm text-muted-foreground">Sign in to your account.</p>
</header> </header>
<label class="block space-y-1.5"> <label class="block space-y-1.5">

View File

@@ -242,10 +242,10 @@
<EmptyState icon={Sparkles} title="Nothing to review"> <EmptyState icon={Sparkles} title="Nothing to review">
{#snippet descriptionSnippet()} {#snippet descriptionSnippet()}
<p> <p>
PhotoPrism's indexer flags photos with a low quality score for human The indexer flags photos with a low quality score for human review. New
review. New arrivals with missing EXIF, low resolution, or unknown arrivals with missing EXIF, low resolution, or unknown cameras will land
cameras will land here. The Stacks and Cross-folder tabs above stay here. The Stacks and Cross-folder tabs above stay available for
available for duplicate cleanup. duplicate cleanup.
</p> </p>
{/snippet} {/snippet}
</EmptyState> </EmptyState>