3 Commits
Author SHA1 Message Date
Crowdin Botandjake bd8ae4ccf9 New Crowdin translations by GitHub Action 2026-07-12 17:32:44 -04:00
jakeandGitHub 553fe98013 feat: add "Mark Unwatched" toggle for movies on web and native (#52)
- Replace the static "Mark Watched" button with a toggle that shows "Mark Unwatched" (destructive style) when a movie is already completed
- Add `handleUnwatchMovie` to web `useTitleActions` with optimistic update (reverts status to `in_watchlist` on error)
- Add `unwatchMovie` mutation to native `useTitleActions` hook and `titleActions` imperative helper
- Update poster-card and upcoming-row context menus to show the correct action based on current watch status
- Wire the `M` keyboard shortcut on the title detail page to unwatch when the movie is already marked watched
- Add i18n strings for "Mark Unwatched", "Marked as unwatched", and "Failed to mark as unwatched"
2026-07-12 16:53:52 -04:00
jakeandGitHub 0c747a9275 fix(webhooks): ignore episode-level Plex TMDB GUIDs when parsing scrobble events (#53)
Plex attaches TMDB GUIDs that identify the individual episode, not the parent series, so using them as `tmdbId` caused incorrect series lookups. Now only movie scrobbles populate `tmdbId` from the TMDB GUID; episode scrobbles rely on IMDB/TVDB IDs (and the title) to resolve the show via `resolveShowTmdbId`.

- Extract IMDB/TMDB/TVDB prefix constants to avoid magic strings
- Add `parsePlexPayload` test asserting `tmdbId` is `undefined` for episode events
- Add `processWebhook` integration test verifying `resolveShowTmdbId` is called without a TMDB ID for Plex episodes
- Hoist `makePlexForm` helper to module scope so it's available across all describe blocks
2026-07-12 16:53:04 -04:00
22 changed files with 539 additions and 74 deletions
+32 -8
View File
@@ -12,6 +12,7 @@ import {
IconStarFilled,
IconThumbUp,
IconUsers,
IconX,
} from "@tabler/icons-react-native";
import { useQuery } from "@tanstack/react-query";
import { GlassView, isLiquidGlassAvailable } from "expo-glass-effect";
@@ -98,22 +99,27 @@ export default function TitleDetailScreen() {
const { back } = useRouter();
const useAutomaticInsets = process.env.EXPO_OS === "ios";
const [titleAccent, mutedForeground, titleAccentForeground] = useCSSVariable([
const [titleAccent, mutedForeground, titleAccentForeground, destructiveColor] = useCSSVariable([
"--color-title-accent",
"--color-muted-foreground",
"--color-title-accent-foreground",
]) as [string, string, string];
"--color-destructive",
]) as [string, string, string, string];
const detail = useQuery(orpc.titles.get.queryOptions({ input: { id } }));
const userInfo = useQuery(orpc.tracking.userInfo.queryOptions({ input: { id } }));
const recommendations = useQuery(orpc.titles.similar.queryOptions({ input: { id } }));
const { updateStatus, updateRating, watchMovie } = useTitleActions({
const { updateStatus, updateRating, watchMovie, unwatchMovie } = useTitleActions({
toasts: {
watchMovie: () => {
const name = title?.title;
return name ? t`Marked "${name}" as watched` : t`Marked as watched`;
},
unwatchMovie: () => {
const name = title?.title;
return name ? t`Marked "${name}" as unwatched` : t`Marked as unwatched`;
},
},
});
@@ -147,6 +153,7 @@ export default function TitleDetailScreen() {
() => new Set(userInfo.data?.episodeWatches ?? []),
[userInfo.data?.episodeWatches],
);
const isMovieWatched = userInfo.data?.status === "completed";
const recItems = useMemo<PosterRowItem[]>(
() =>
@@ -413,17 +420,34 @@ export default function TitleDetailScreen() {
updateStatus.mutate({ id, status: null });
}
}}
isPending={updateStatus.isPending || watchMovie.isPending}
isPending={updateStatus.isPending || watchMovie.isPending || unwatchMovie.isPending}
/>
{title.type === "movie" && (
<Pressable
onPress={() => watchMovie.mutate({ scope: "movie", ids: [id] })}
disabled={watchMovie.isPending}
className="bg-title-accent flex-row items-center gap-1.5 rounded-lg px-4 py-2"
onPress={() => {
if (isMovieWatched) {
unwatchMovie.mutate({ scope: "movie", ids: [id] });
} else {
watchMovie.mutate({ scope: "movie", ids: [id] });
}
}}
disabled={watchMovie.isPending || unwatchMovie.isPending}
className={
isMovieWatched
? "border-destructive/20 bg-destructive/10 flex-row items-center gap-1.5 rounded-lg border px-4 py-2"
: "bg-title-accent flex-row items-center gap-1.5 rounded-lg px-4 py-2"
}
>
{watchMovie.isPending ? (
{watchMovie.isPending || unwatchMovie.isPending ? (
<Spinner size="sm" />
) : isMovieWatched ? (
<>
<ScaledIcon icon={IconX} size={16} color={destructiveColor} />
<Text className="text-destructive font-sans text-sm font-medium">
<Trans>Mark Unwatched</Trans>
</Text>
</>
) : (
<>
<ScaledIcon icon={IconCheck} size={16} color={titleAccentForeground} />
@@ -126,7 +126,14 @@ export function UpcomingRow({ item }: { item: UpcomingItem }) {
<Link.Trigger withAppleZoom>{rowContent}</Link.Trigger>
<Link.Preview />
<Link.Menu>
{item.titleType === "movie" && (
{item.titleType === "movie" && item.userStatus === "completed" && (
<Link.MenuAction
title={t`Mark Unwatched`}
icon="xmark.circle"
onPress={() => titleActions.unwatchMovie(item.titleId, item.titleName)}
/>
)}
{item.titleType === "movie" && item.userStatus !== "completed" && (
<Link.MenuAction
title={t`Mark Watched`}
icon="checkmark.circle"
@@ -217,7 +217,14 @@ export const PosterCard = memo(function PosterCard({
onPress={handleQuickAddPress}
/>
)}
{type === "movie" && (
{type === "movie" && userStatus === "completed" && (
<Link.MenuAction
title={t`Mark Unwatched`}
icon="xmark.circle"
onPress={() => titleActions.unwatchMovie(id, title)}
/>
)}
{type === "movie" && userStatus !== "completed" && (
<Link.MenuAction
title={t`Mark Watched`}
icon="checkmark.circle"
@@ -26,6 +26,7 @@ interface UseTitleActionsOptions {
toasts?: {
updateStatus?: ToastOverride<{ id: string; status: string | null }>;
watchMovie?: ToastOverride<WatchInput>;
unwatchMovie?: ToastOverride<WatchInput>;
updateRating?: ToastOverride<{ id: string; stars: number }>;
watchEpisode?: ToastOverride<WatchInput>;
unwatchEpisode?: ToastOverride<WatchInput>;
@@ -67,6 +68,16 @@ export function useTitleActions(options?: UseTitleActionsOptions) {
}),
);
const unwatchMovie = useMutation(
orpc.tracking.unwatch.mutationOptions({
onSuccess: (_data, input) => {
toast.success(resolveToast(toastOverrides?.unwatchMovie, t`Marked as unwatched`, input));
invalidateTitleQueries();
},
onError: () => toast.error(t`Failed to mark as unwatched`),
}),
);
const updateRating = useMutation(
orpc.tracking.rate.mutationOptions({
onSuccess: (_data, input) => {
@@ -115,6 +126,7 @@ export function useTitleActions(options?: UseTitleActionsOptions) {
return {
updateStatus,
watchMovie,
unwatchMovie,
updateRating,
watchEpisode,
unwatchEpisode,
+14
View File
@@ -55,6 +55,20 @@ export const titleActions = {
}
},
async unwatchMovie(id: string, titleName?: string) {
try {
await client.tracking.unwatch({ scope: "movie", ids: [id] });
toast.success(
titleName
? i18n._(msg`Marked "${titleName}" as unwatched`)
: i18n._(msg`Marked as unwatched`),
);
invalidateTitleQueries();
} catch {
toast.error(i18n._(msg`Failed to mark as unwatched`));
}
},
async removeFromLibrary(id: string) {
try {
await client.tracking.updateStatus({ id, status: null });
@@ -1,5 +1,5 @@
import { Trans } from "@lingui/react/macro";
import { IconCheck } from "@tabler/icons-react";
import { IconCheck, IconX } from "@tabler/icons-react";
import { Button } from "@/components/ui/button";
import { Separator } from "@/components/ui/separator";
@@ -12,19 +12,31 @@ import { useTitleActions } from "./use-title-actions";
export function TitleActions() {
const { titleType } = useTitleContext();
const { userStatus, userRating } = useTitleUserInfo();
const { handleStatusChange, handleRating, handleWatchMovie } = useTitleActions();
const { handleStatusChange, handleRating, handleWatchMovie, handleUnwatchMovie } =
useTitleActions();
const isMovieWatched = userStatus === "completed";
return (
<div className="flex flex-wrap items-center gap-3">
<StatusButton currentStatus={userStatus ?? null} onChange={handleStatusChange} />
{titleType === "movie" && (
<Button
onClick={handleWatchMovie}
onClick={isMovieWatched ? handleUnwatchMovie : handleWatchMovie}
variant={isMovieWatched ? "destructive" : "default"}
size="lg"
className="hover:shadow-primary/20 h-9 rounded-lg px-4 text-sm hover:shadow-md active:scale-[0.97]"
className={`h-9 rounded-lg px-4 text-sm hover:shadow-md active:scale-[0.97] ${isMovieWatched ? "hover:shadow-destructive/20" : "hover:shadow-primary/20"}`}
>
<IconCheck aria-hidden={true} className="size-3.5" />
<Trans>Mark Watched</Trans>
{isMovieWatched ? (
<>
<IconX aria-hidden={true} className="size-3.5" />
<Trans>Mark Unwatched</Trans>
</>
) : (
<>
<IconCheck aria-hidden={true} className="size-3.5" />
<Trans>Mark Watched</Trans>
</>
)}
</Button>
)}
<Separator orientation="vertical" className="bg-border/50 mx-0.5 my-auto h-6" />
@@ -9,7 +9,8 @@ import { useTitleActions } from "./use-title-actions";
export function TitleKeyboardShortcuts() {
const { titleType } = useTitleContext();
const { userStatus } = useTitleUserInfo();
const { handleStatusChange, handleRating, handleWatchMovie } = useTitleActions();
const { handleStatusChange, handleRating, handleWatchMovie, handleUnwatchMovie } =
useTitleActions();
const commandPaletteOpen = useAtomValue(commandPaletteOpenAtom);
const enabled = !commandPaletteOpen;
@@ -21,7 +22,13 @@ export function TitleKeyboardShortcuts() {
useHotkey(
"M",
() => {
if (titleType === "movie") handleWatchMovie();
if (titleType === "movie") {
if (userStatus === "completed") {
handleUnwatchMovie();
} else {
handleWatchMovie();
}
}
},
{ enabled },
);
@@ -135,6 +135,19 @@ export function useTitleActions() {
}
}, [getUserInfo, setUserInfo, queryClient, userInfoKey, titleId, titleName, watch, t]);
const handleUnwatchMovie = useCallback(async () => {
await queryClient.cancelQueries({ queryKey: userInfoKey });
const prevStatus = getUserInfo().status;
setUserInfo((old) => ({ ...old, status: "in_watchlist" }));
try {
await unwatch({ scope: "movie", ids: [titleId] });
toast.success(t`Marked "${titleName}" as unwatched`);
} catch {
setUserInfo((old) => ({ ...old, status: prevStatus }));
toast.error(t`Failed to mark as unwatched`);
}
}, [getUserInfo, setUserInfo, queryClient, userInfoKey, titleId, titleName, unwatch, t]);
const handleWatchEpisode = useCallback(
async (episodeId: string, seasonNum: number, epNum: number, isWatched: boolean) => {
await queryClient.cancelQueries({ queryKey: userInfoKey });
@@ -352,6 +365,7 @@ export function useTitleActions() {
handleStatusChange,
handleRating,
handleWatchMovie,
handleUnwatchMovie,
handleWatchEpisode,
handleMarkSeason,
handleUnmarkSeason,
+12 -3
View File
@@ -13,6 +13,10 @@ import { logEpisodeWatch, logMovieWatch } from "./tracking";
const log = createLogger("webhooks");
const IMDB_GUID_PREFIX = "imdb://";
const TMDB_GUID_PREFIX = "tmdb://";
const TVDB_GUID_PREFIX = "tvdb://";
// ─── Types ──────────────────────────────────────────────────────────
export interface WebhookEvent {
@@ -71,9 +75,14 @@ export function parsePlexPayload(formData: FormData): WebhookEvent | null {
if (Array.isArray(guids)) {
for (const g of guids) {
const id = g.id ?? "";
if (id.startsWith("tmdb://")) tmdbId = toOptionalInt(id.slice(7));
else if (id.startsWith("imdb://")) imdbId = id.slice(7);
else if (id.startsWith("tvdb://")) tvdbId = id.slice(7);
if (id.startsWith(TMDB_GUID_PREFIX)) {
// Plex episode TMDB GUIDs identify episodes, not series.
if (isMovie) tmdbId = toOptionalInt(id.slice(TMDB_GUID_PREFIX.length));
} else if (id.startsWith(IMDB_GUID_PREFIX)) {
imdbId = id.slice(IMDB_GUID_PREFIX.length);
} else if (id.startsWith(TVDB_GUID_PREFIX)) {
tvdbId = id.slice(TVDB_GUID_PREFIX.length);
}
}
}
+65 -6
View File
@@ -54,6 +54,12 @@ beforeEach(() => {
mockGetTvDetails.mockReset().mockResolvedValue({ number_of_seasons: 1 });
});
function makePlexForm(payload: Record<string, unknown>): FormData {
const form = new FormData();
form.set("payload", JSON.stringify(payload));
return form;
}
// ─── toOptionalInt ──────────────────────────────────────────────────
describe("toOptionalInt", () => {
@@ -86,12 +92,6 @@ describe("toOptionalInt", () => {
// ─── parsePlexPayload ───────────────────────────────────────────────
describe("parsePlexPayload", () => {
function makePlexForm(payload: Record<string, unknown>): FormData {
const form = new FormData();
form.set("payload", JSON.stringify(payload));
return form;
}
test("parses a movie scrobble event", () => {
const result = parsePlexPayload(
makePlexForm({
@@ -143,6 +143,33 @@ describe("parsePlexPayload", () => {
});
});
test("ignores episode-level Plex TMDB GUIDs", () => {
const result = parsePlexPayload(
makePlexForm({
event: "media.scrobble",
Metadata: {
type: "episode",
title: "Episode Title",
grandparentTitle: "The Pitt",
parentIndex: 1,
index: 14,
Guid: [{ id: "imdb://tt35740476" }, { id: "tmdb://6951292" }, { id: "tvdb://11560129" }],
},
}),
);
expect(result).toEqual({
provider: "plex",
mediaType: "episode",
title: "Episode Title",
tmdbId: undefined,
imdbId: "tt35740476",
tvdbId: "11560129",
seasonNumber: 1,
episodeNumber: 14,
showTitle: "The Pitt",
});
});
test("returns null for non-scrobble events", () => {
expect(parsePlexPayload(makePlexForm({ event: "media.play" }))).toBeNull();
});
@@ -451,6 +478,38 @@ describe("processWebhook", () => {
expect(result.status).toBe("success");
});
test("resolves parsed Plex episodes without passing the episode TMDB ID", async () => {
mockResolveShowTmdbId.mockResolvedValue(1396);
const { titleId } = insertTvShow("tv-1", 1396, 1, 14, { title: "The Pitt" });
mockGetOrFetchTitleByTmdbId.mockResolvedValue({ id: titleId });
const event = parsePlexPayload(
makePlexForm({
event: "media.scrobble",
Metadata: {
type: "episode",
title: "Episode Title",
grandparentTitle: "The Pitt",
parentIndex: 1,
index: 14,
Guid: [{ id: "imdb://tt35740476" }, { id: "tmdb://6951292" }, { id: "tvdb://11560129" }],
},
}),
);
expect(event).not.toBeNull();
if (!event) throw new Error("Expected Plex episode event");
const result = await processWebhook(connectionId, userId, "plex", event);
expect(result.status).toBe("success");
expect(mockResolveShowTmdbId).toHaveBeenCalledWith({
tmdbId: undefined,
imdbId: "tt35740476",
tvdbId: "11560129",
title: "The Pitt",
});
});
test("returns error when episode cannot be resolved", async () => {
mockResolveShowTmdbId.mockResolvedValue(null);
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: ar\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
@@ -346,7 +346,6 @@ msgstr "إضافة إلى قائمة المشاهدة"
msgid "Added \"{titleName}\" to watchlist"
msgstr "تمت إضافة \"{titleName}\" إلى قائمة المشاهدة"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "تصدير"
msgid "Failed"
msgstr "فشل"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "فشل الإضافة إلى قائمة المشاهدة"
@@ -1293,6 +1291,12 @@ msgstr "فشل تحميل العنوان"
msgid "Failed to mark all episodes as watched"
msgstr "فشل تحديد جميع الحلقات كمشاهدة"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "فشل تحديث الاسم"
msgid "Failed to update rating"
msgstr "فشل تحديث التقييم"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "فشل تحديث إعداد التسجيل"
@@ -1860,6 +1863,13 @@ msgstr "تمييز الحلقة {epNum} كمشاهَدة"
msgid "Mark Episode Watched"
msgstr "تمييز الحلقة كمشاهَدة"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "تمييز كمشاهَد"
@@ -1871,6 +1881,10 @@ msgstr "تمييز كمشاهَد"
msgid "Mark Watched"
msgstr "تحديد كمشاهدة"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "تم تمييز \"{name}\" كمشاهَد"
@@ -1879,6 +1893,11 @@ msgstr "تم تمييز \"{name}\" كمشاهَد"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "تم تحديد جميع حلقات \"{titleName}\" كمشاهدة"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: de\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -346,7 +346,6 @@ msgstr "Zur Merkliste hinzufügen"
msgid "Added \"{titleName}\" to watchlist"
msgstr "\"{titleName}\" zur Merkliste hinzugefügt"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "Exportieren"
msgid "Failed"
msgstr "Fehlgeschlagen"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "Konnte nicht zur Merkliste hinzugefügt werden"
@@ -1293,6 +1291,12 @@ msgstr "Titel konnte nicht geladen werden"
msgid "Failed to mark all episodes as watched"
msgstr "Nicht alle Episoden konnten als gesehen markiert werden"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "Name konnte nicht aktualisiert werden"
msgid "Failed to update rating"
msgstr "Bewertung konnte nicht aktualisiert werden"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "Registrierungseinstellung konnte nicht aktualisiert werden"
@@ -1860,6 +1863,13 @@ msgstr "Episode {epNum} als gesehen markieren"
msgid "Mark Episode Watched"
msgstr "Episode als gesehen markieren"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "Als gesehen markieren"
@@ -1871,6 +1881,10 @@ msgstr "Als gesehen markieren"
msgid "Mark Watched"
msgstr "Als gesehen markieren"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "„{name}“ als gesehen markiert"
@@ -1879,6 +1893,11 @@ msgstr "„{name}“ als gesehen markiert"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "Alle Folgen von \"{titleName}\" als gesehen markiert"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+28 -3
View File
@@ -346,7 +346,6 @@ msgstr ""
msgid "Added \"{titleName}\" to watchlist"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "Export"
msgid "Failed"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr ""
@@ -1293,6 +1291,12 @@ msgstr ""
msgid "Failed to mark all episodes as watched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr "Failed to mark as unwatched"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr ""
msgid "Failed to update rating"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr ""
@@ -1860,6 +1863,13 @@ msgstr "Mark episode {epNum} watched"
msgid "Mark Episode Watched"
msgstr "Mark Episode Watched"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr "Mark Unwatched"
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "Mark watched"
@@ -1871,6 +1881,10 @@ msgstr "Mark watched"
msgid "Mark Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr "Marked \"{name}\" as unwatched"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "Marked \"{name}\" as watched"
@@ -1879,6 +1893,11 @@ msgstr "Marked \"{name}\" as watched"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr "Marked \"{titleName}\" as unwatched"
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "Marked all episodes of \"{titleName}\" as watched"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr "Marked as unwatched"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: es\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -346,7 +346,6 @@ msgstr "Añadir a la lista"
msgid "Added \"{titleName}\" to watchlist"
msgstr "\"{titleName}\" añadido a la lista"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "Exportar"
msgid "Failed"
msgstr "Fallido"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "Error al añadir a la lista"
@@ -1293,6 +1291,12 @@ msgstr "Error al cargar el título"
msgid "Failed to mark all episodes as watched"
msgstr "Error al marcar todos los episodios como vistos"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "Error al actualizar el nombre"
msgid "Failed to update rating"
msgstr "Error al actualizar la valoración"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "Error al actualizar el ajuste de registro"
@@ -1860,6 +1863,13 @@ msgstr "Marcar episodio {epNum} como visto"
msgid "Mark Episode Watched"
msgstr "Marcar episodio como visto"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "Marcar como visto"
@@ -1871,6 +1881,10 @@ msgstr "Marcar como visto"
msgid "Mark Watched"
msgstr "Marcar como visto"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "Marcado \"{name}\" como visto"
@@ -1879,6 +1893,11 @@ msgstr "Marcado \"{name}\" como visto"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "Se marcaron todos los episodios de \"{titleName}\" como vistos"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: fr\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
@@ -346,7 +346,6 @@ msgstr "Ajouter à la liste de suivi"
msgid "Added \"{titleName}\" to watchlist"
msgstr "« {titleName} » ajouté à la liste de suivi"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "Exporter"
msgid "Failed"
msgstr "Échoué"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "Échec de l'ajout à la liste de suivi"
@@ -1293,6 +1291,12 @@ msgstr "Échec du chargement du titre"
msgid "Failed to mark all episodes as watched"
msgstr "Échec du marquage de tous les épisodes comme visionnés"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "Échec de la mise à jour du nom"
msgid "Failed to update rating"
msgstr "Échec de la mise à jour de la note"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "Échec de la mise à jour du paramètre d'inscription"
@@ -1860,6 +1863,13 @@ msgstr "Marquer l'épisode {epNum} comme regardé"
msgid "Mark Episode Watched"
msgstr "Marquer l'épisode comme regardé"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "Marquer comme regardé"
@@ -1871,6 +1881,10 @@ msgstr "Marquer comme regardé"
msgid "Mark Watched"
msgstr "Marquer comme visionné"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "« {name} » marqué comme regardé"
@@ -1879,6 +1893,11 @@ msgstr "« {name} » marqué comme regardé"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "Tous les épisodes de \"{titleName}\" marqués comme vus"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: he\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: Hebrew\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
@@ -346,7 +346,6 @@ msgstr "הוסף לרשימת הצפייה"
msgid "Added \"{titleName}\" to watchlist"
msgstr "\"{titleName}\" נוסף לרשימת הצפייה"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "ייצוא"
msgid "Failed"
msgstr "נכשל"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "הוספה לרשימת הצפייה נכשלה"
@@ -1293,6 +1291,12 @@ msgstr "טעינת הכותרת נכשלה"
msgid "Failed to mark all episodes as watched"
msgstr "סימון כל הפרקים כנצפו נכשל"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "עדכון השם נכשל"
msgid "Failed to update rating"
msgstr "עדכון הדירוג נכשל"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "עדכון הגדרת ההרשמה נכשל"
@@ -1860,6 +1863,13 @@ msgstr "סמן פרק {epNum} כנצפה"
msgid "Mark Episode Watched"
msgstr "סמן פרק כנצפה"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "סמן כנצפה"
@@ -1871,6 +1881,10 @@ msgstr "סמן כנצפה"
msgid "Mark Watched"
msgstr "סמן כנצפה"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "סומן \"{name}\" כנצפה"
@@ -1879,6 +1893,11 @@ msgstr "סומן \"{name}\" כנצפה"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "כל פרקי \"{titleName}\" סומנו כנצפו"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: it\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -346,7 +346,6 @@ msgstr "Aggiungi alla watchlist"
msgid "Added \"{titleName}\" to watchlist"
msgstr "Aggiunto \"{titleName}\" alla watchlist"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "Esporta"
msgid "Failed"
msgstr "Non riuscito"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "Impossibile aggiungere alla watchlist"
@@ -1293,6 +1291,12 @@ msgstr "Impossibile caricare il titolo"
msgid "Failed to mark all episodes as watched"
msgstr "Impossibile segnare tutti gli episodi come visti"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "Impossibile aggiornare il nome"
msgid "Failed to update rating"
msgstr "Impossibile aggiornare la valutazione"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "Impossibile aggiornare l'impostazione di registrazione"
@@ -1860,6 +1863,13 @@ msgstr "Segna episodio {epNum} come visto"
msgid "Mark Episode Watched"
msgstr "Segna episodio come visto"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "Segna come visto"
@@ -1871,6 +1881,10 @@ msgstr "Segna come visto"
msgid "Mark Watched"
msgstr "Segna come visto"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "Segnato “{name}” come visto"
@@ -1879,6 +1893,11 @@ msgstr "Segnato “{name}” come visto"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "Tutti gli episodi di \"{titleName}\" segnati come visti"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: ja\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -346,7 +346,6 @@ msgstr "ウォッチリストに追加"
msgid "Added \"{titleName}\" to watchlist"
msgstr "「{titleName}」をウォッチリストに追加しました"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "エクスポート"
msgid "Failed"
msgstr "失敗"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "ウォッチリストへの追加に失敗しました"
@@ -1293,6 +1291,12 @@ msgstr "作品の読み込みに失敗しました"
msgid "Failed to mark all episodes as watched"
msgstr "すべてのエピソードを視聴済みにするのに失敗しました"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "名前の更新に失敗しました"
msgid "Failed to update rating"
msgstr "評価の更新に失敗しました"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "登録設定の更新に失敗しました"
@@ -1860,6 +1863,13 @@ msgstr "エピソード{epNum}を視聴済みにする"
msgid "Mark Episode Watched"
msgstr "エピソードを視聴済みにする"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "視聴済みにする"
@@ -1871,6 +1881,10 @@ msgstr "視聴済みにする"
msgid "Mark Watched"
msgstr "視聴済みにする"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "「{name}」を視聴済みにしました"
@@ -1879,6 +1893,11 @@ msgstr "「{name}」を視聴済みにしました"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "「{titleName}」のすべてのエピソードを視聴済みにしま
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: ko\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -346,7 +346,6 @@ msgstr "찜 목록에 추가"
msgid "Added \"{titleName}\" to watchlist"
msgstr "\"{titleName}\"를 찜 목록에 추가했습니다"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "내보내기"
msgid "Failed"
msgstr "실패"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "찜 목록에 추가 실패"
@@ -1293,6 +1291,12 @@ msgstr "작품 정보를 불러오지 못했습니다"
msgid "Failed to mark all episodes as watched"
msgstr "모든 에피소드 시청 처리 실패"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "이름 업데이트 실패"
msgid "Failed to update rating"
msgstr "평점 업데이트 실패"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "회원가입 설정 업데이트 실패"
@@ -1860,6 +1863,13 @@ msgstr "에피소드 {epNum} 시청함으로 표시"
msgid "Mark Episode Watched"
msgstr "에피소드 시청함으로 표시"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "시청함으로 표시"
@@ -1871,6 +1881,10 @@ msgstr "시청함으로 표시"
msgid "Mark Watched"
msgstr "시청 완료 표시"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "\"{name}\"을(를) 시청함으로 표시했습니다"
@@ -1879,6 +1893,11 @@ msgstr "\"{name}\"을(를) 시청함으로 표시했습니다"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "\"{titleName}\"의 모든 에피소드를 시청 완료로 표시했습
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: nl\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -346,7 +346,6 @@ msgstr "Toevoegen aan kijklijst"
msgid "Added \"{titleName}\" to watchlist"
msgstr "\"{titleName}\" toegevoegd aan kijklijst"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "Exporteren"
msgid "Failed"
msgstr "Mislukt"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "Toevoegen aan kijklijst mislukt"
@@ -1293,6 +1291,12 @@ msgstr "Titel laden mislukt"
msgid "Failed to mark all episodes as watched"
msgstr "Alle afleveringen als bekeken markeren mislukt"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "Naam bijwerken mislukt"
msgid "Failed to update rating"
msgstr "Beoordeling bijwerken mislukt"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "Registratie-instelling bijwerken mislukt"
@@ -1860,6 +1863,13 @@ msgstr "Aflevering {epNum} als bekeken markeren"
msgid "Mark Episode Watched"
msgstr "Aflevering als bekeken markeren"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "Als bekeken markeren"
@@ -1871,6 +1881,10 @@ msgstr "Als bekeken markeren"
msgid "Mark Watched"
msgstr "Als bekeken markeren"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "\"{name}\" als bekeken gemarkeerd"
@@ -1879,6 +1893,11 @@ msgstr "\"{name}\" als bekeken gemarkeerd"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "Alle afleveringen van \"{titleName}\" als bekeken gemarkeerd"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: pt\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -346,7 +346,6 @@ msgstr "Adicionar à Lista de Desejos"
msgid "Added \"{titleName}\" to watchlist"
msgstr "Adicionado \"{titleName}\" à lista de desejos"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "Exportar"
msgid "Failed"
msgstr "Falhou"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "Falha ao adicionar à lista de desejos"
@@ -1293,6 +1291,12 @@ msgstr "Falha ao carregar título"
msgid "Failed to mark all episodes as watched"
msgstr "Falha ao marcar todos os episódios como assistidos"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "Falha ao atualizar nome"
msgid "Failed to update rating"
msgstr "Falha ao atualizar avaliação"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "Falha ao atualizar configuração de registro"
@@ -1860,6 +1863,13 @@ msgstr "Marcar episódio {epNum} como assistido"
msgid "Mark Episode Watched"
msgstr "Marcar Episódio como Assistido"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "Marcar como assistido"
@@ -1871,6 +1881,10 @@ msgstr "Marcar como assistido"
msgid "Mark Watched"
msgstr "Marcar como Assistido"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "Marcado \"{name}\" como assistido"
@@ -1879,6 +1893,11 @@ msgstr "Marcado \"{name}\" como assistido"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "Todos os episódios de \"{titleName}\" marcados como vistos"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
+29 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: zh\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-25 01:01\n"
"PO-Revision-Date: 2026-07-12 21:31\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -346,7 +346,6 @@ msgstr "添加到观看列表"
msgid "Added \"{titleName}\" to watchlist"
msgstr "已将“{titleName}”添加到观看列表"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1236,7 +1235,6 @@ msgstr "导出"
msgid "Failed"
msgstr "失败"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Failed to add to watchlist"
msgstr "添加到待看列表失败"
@@ -1293,6 +1291,12 @@ msgstr "加载影视内容失败"
msgid "Failed to mark all episodes as watched"
msgstr "标记所有剧集为已观看失败"
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Failed to mark as unwatched"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
@@ -1386,7 +1390,6 @@ msgstr "更新名称失败"
msgid "Failed to update rating"
msgstr "更新评分失败"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Failed to update registration setting"
msgstr "更新注册设置失败"
@@ -1860,6 +1863,13 @@ msgstr "将第 {epNum} 集标记为已观看"
msgid "Mark Episode Watched"
msgstr "标记剧集为已观看"
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Unwatched"
msgstr ""
#: apps/web/src/components/command-palette.tsx
msgid "Mark watched"
msgstr "标记为已观看"
@@ -1871,6 +1881,10 @@ msgstr "标记为已观看"
msgid "Mark Watched"
msgstr "标记为已观看"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr "已将“{name}”标记为已观看"
@@ -1879,6 +1893,11 @@ msgstr "已将“{name}”标记为已观看"
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as unwatched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Marked \"{titleName}\" as watched"
@@ -1898,6 +1917,12 @@ msgstr "已将\"{titleName}\"的所有剧集标记为已观看"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as unwatched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts