mirror of
https://github.com/jakejarvis/sofa.git
synced 2026-08-29 01:35:39 -04:00
refactor: consolidate watchlist states (#18)
- Rename `watchlist` → `in_watchlist` and `in_progress` → `watching` across the full stack (DB migration, Drizzle schema, core services, API contract, web, native) - Add a new `caught_up` status for TV shows where all aired episodes are watched but the show is still airing - Add `titles.watchAll` procedure and `markAllWatched` action to mark every episode of a TV show as watched in one step; replace the old "Mark as Watching" / "Mark as Completed" context-menu actions with "Mark All Watched" (TV) and "Mark as Watched" (movie) - Extract `display-status.ts` in `@sofa/api` to share status → display label/color logic between web and native - Add `getDisplayStatusesByTitleIds` to `@sofa/core/tracking` and wire it into the dashboard library feed so clients receive resolved display statuses - Show a destructive Alert confirmation before removing a title from the library (native) - Remove "Mark as Completed" from the continue-watching card context menu - Update i18n catalogs for all 6 locales (de, en, es, fr, it, pt)
This commit is contained in:
@@ -48,7 +48,7 @@ export default function ExploreScreen() {
|
|||||||
() =>
|
() =>
|
||||||
Object.assign({}, ...(trending.data?.pages.map((p) => p.userStatuses) ?? [])) as Record<
|
Object.assign({}, ...(trending.data?.pages.map((p) => p.userStatuses) ?? [])) as Record<
|
||||||
string,
|
string,
|
||||||
"watchlist" | "in_progress" | "completed"
|
"in_watchlist" | "watching" | "caught_up" | "completed"
|
||||||
>,
|
>,
|
||||||
[trending.data?.pages],
|
[trending.data?.pages],
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ export default function PersonDetailScreen() {
|
|||||||
() =>
|
() =>
|
||||||
Object.assign({}, ...(data?.pages.map((p) => p.userStatuses) ?? [])) as Record<
|
Object.assign({}, ...(data?.pages.map((p) => p.userStatuses) ?? [])) as Record<
|
||||||
string,
|
string,
|
||||||
"watchlist" | "in_progress" | "completed"
|
"in_watchlist" | "watching" | "caught_up" | "completed"
|
||||||
>,
|
>,
|
||||||
[data?.pages],
|
[data?.pages],
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ export default function TitleDetailScreen() {
|
|||||||
<StatusActionButton
|
<StatusActionButton
|
||||||
currentStatus={userInfo.data?.status ?? null}
|
currentStatus={userInfo.data?.status ?? null}
|
||||||
onStatusChange={(status) => {
|
onStatusChange={(status) => {
|
||||||
if (status === "watchlist") {
|
if (status === "in_watchlist") {
|
||||||
quickAddMutation.mutate({ id });
|
quickAddMutation.mutate({ id });
|
||||||
} else {
|
} else {
|
||||||
updateStatus.mutate({ id, status: null });
|
updateStatus.mutate({ id, status: null });
|
||||||
|
|||||||
@@ -104,11 +104,6 @@ export const ContinueWatchingCard = memo(function ContinueWatchingCard({
|
|||||||
</Link.Trigger>
|
</Link.Trigger>
|
||||||
<Link.Preview />
|
<Link.Preview />
|
||||||
<Link.Menu>
|
<Link.Menu>
|
||||||
<Link.MenuAction
|
|
||||||
title={t`Mark as Completed`}
|
|
||||||
icon="checkmark.circle"
|
|
||||||
onPress={() => titleActions.markCompleted(item.title.id, item.title.title)}
|
|
||||||
/>
|
|
||||||
<Link.MenuAction
|
<Link.MenuAction
|
||||||
title={t`Remove from Library`}
|
title={t`Remove from Library`}
|
||||||
icon="trash"
|
icon="trash"
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export interface PosterRowItem {
|
|||||||
releaseDate?: string | null;
|
releaseDate?: string | null;
|
||||||
firstAirDate?: string | null;
|
firstAirDate?: string | null;
|
||||||
voteAverage?: number | null;
|
voteAverage?: number | null;
|
||||||
userStatus?: "watchlist" | "in_progress" | "completed" | null;
|
userStatus?: "in_watchlist" | "watching" | "caught_up" | "completed" | null;
|
||||||
episodeProgress?: { watched: number; total: number } | null;
|
episodeProgress?: { watched: number; total: number } | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import { SectionHeader } from "@/components/ui/section-header";
|
|||||||
import { Text } from "@/components/ui/text";
|
import { Text } from "@/components/ui/text";
|
||||||
import { orpc } from "@/lib/orpc";
|
import { orpc } from "@/lib/orpc";
|
||||||
|
|
||||||
type TitleStatus = "watchlist" | "in_progress" | "completed";
|
type TitleStatus = "in_watchlist" | "watching" | "caught_up" | "completed";
|
||||||
const genreChipsContentStyle = { paddingHorizontal: 16 };
|
const genreChipsContentStyle = { paddingHorizontal: 16 };
|
||||||
|
|
||||||
export function FilterableTitleRow({
|
export function FilterableTitleRow({
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ export function ContinueWatchingBanner({
|
|||||||
[seasons, watchedEpisodeIds],
|
[seasons, watchedEpisodeIds],
|
||||||
);
|
);
|
||||||
|
|
||||||
if (userStatus !== "in_progress" || !nextEpisode) return null;
|
if (userStatus !== "watching" || !nextEpisode) return null;
|
||||||
|
|
||||||
const stillUrl = nextEpisode.stillPath ?? backdropPath ?? null;
|
const stillUrl = nextEpisode.stillPath ?? backdropPath ?? null;
|
||||||
const progress = totalEpisodes > 0 ? (watchedEpisodes / totalEpisodes) * 100 : 0;
|
const progress = totalEpisodes > 0 ? (watchedEpisodes / totalEpisodes) * 100 : 0;
|
||||||
|
|||||||
@@ -5,30 +5,35 @@ import {
|
|||||||
IconPlayerPlayFilled,
|
IconPlayerPlayFilled,
|
||||||
IconPlus,
|
IconPlus,
|
||||||
} from "@tabler/icons-react-native";
|
} from "@tabler/icons-react-native";
|
||||||
import { Pressable } from "react-native";
|
import { Alert, Pressable } from "react-native";
|
||||||
import { useCSSVariable } from "uniwind";
|
import { useCSSVariable } from "uniwind";
|
||||||
|
|
||||||
import { ScaledIcon } from "@/components/ui/scaled-icon";
|
import { ScaledIcon } from "@/components/ui/scaled-icon";
|
||||||
import { Text } from "@/components/ui/text";
|
import { Text } from "@/components/ui/text";
|
||||||
import * as Haptics from "@/utils/haptics";
|
import * as Haptics from "@/utils/haptics";
|
||||||
|
|
||||||
type TitleStatus = "watchlist" | "in_progress" | "completed";
|
type TitleStatus = "in_watchlist" | "watching" | "caught_up" | "completed";
|
||||||
|
|
||||||
const STATUS_ICONS = {
|
const STATUS_ICONS = {
|
||||||
watchlist: IconBookmarkFilled,
|
in_watchlist: IconBookmarkFilled,
|
||||||
in_progress: IconPlayerPlayFilled,
|
watching: IconPlayerPlayFilled,
|
||||||
|
caught_up: IconCheck,
|
||||||
completed: IconCheck,
|
completed: IconCheck,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
const STATUS_STYLES = {
|
const STATUS_STYLES = {
|
||||||
watchlist: {
|
in_watchlist: {
|
||||||
bgClass: "bg-title-accent/10 border-title-accent/20",
|
bgClass: "bg-title-accent/10 border-title-accent/20",
|
||||||
textClass: "text-title-accent",
|
textClass: "text-title-accent",
|
||||||
},
|
},
|
||||||
in_progress: {
|
watching: {
|
||||||
bgClass: "bg-title-accent/10 border-title-accent/20",
|
bgClass: "bg-title-accent/10 border-title-accent/20",
|
||||||
textClass: "text-title-accent",
|
textClass: "text-title-accent",
|
||||||
},
|
},
|
||||||
|
caught_up: {
|
||||||
|
bgClass: "bg-status-completed/10 border-status-completed/20",
|
||||||
|
textClass: "text-status-completed",
|
||||||
|
},
|
||||||
completed: {
|
completed: {
|
||||||
bgClass: "bg-status-completed/10 border-status-completed/20",
|
bgClass: "bg-status-completed/10 border-status-completed/20",
|
||||||
textClass: "text-status-completed",
|
textClass: "text-status-completed",
|
||||||
@@ -37,10 +42,12 @@ const STATUS_STYLES = {
|
|||||||
|
|
||||||
function StatusLabel({ status }: { status: TitleStatus }) {
|
function StatusLabel({ status }: { status: TitleStatus }) {
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case "watchlist":
|
case "in_watchlist":
|
||||||
return <Trans>Watchlisted</Trans>;
|
return <Trans>In Watchlist</Trans>;
|
||||||
case "in_progress":
|
case "watching":
|
||||||
return <Trans>Watching</Trans>;
|
return <Trans>Watching</Trans>;
|
||||||
|
case "caught_up":
|
||||||
|
return <Trans>Caught Up</Trans>;
|
||||||
case "completed":
|
case "completed":
|
||||||
return <Trans>Completed</Trans>;
|
return <Trans>Completed</Trans>;
|
||||||
}
|
}
|
||||||
@@ -66,7 +73,7 @@ export function StatusActionButton({
|
|||||||
<Pressable
|
<Pressable
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);
|
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);
|
||||||
onStatusChange("watchlist");
|
onStatusChange("in_watchlist");
|
||||||
}}
|
}}
|
||||||
disabled={isPending}
|
disabled={isPending}
|
||||||
accessibilityRole="button"
|
accessibilityRole="button"
|
||||||
@@ -83,13 +90,25 @@ export function StatusActionButton({
|
|||||||
|
|
||||||
const StatusIcon = STATUS_ICONS[currentStatus];
|
const StatusIcon = STATUS_ICONS[currentStatus];
|
||||||
const styles = STATUS_STYLES[currentStatus];
|
const styles = STATUS_STYLES[currentStatus];
|
||||||
const iconColor = currentStatus === "completed" ? completedColor : titleAccent;
|
const iconColor =
|
||||||
|
currentStatus === "completed" || currentStatus === "caught_up" ? completedColor : titleAccent;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Pressable
|
<Pressable
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);
|
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);
|
||||||
onStatusChange(null);
|
Alert.alert(
|
||||||
|
t`Remove from library?`,
|
||||||
|
t`This title will be removed from your library. Your watch history and ratings will be kept.`,
|
||||||
|
[
|
||||||
|
{ text: t`Cancel`, style: "cancel" },
|
||||||
|
{
|
||||||
|
text: t`Remove`,
|
||||||
|
style: "destructive",
|
||||||
|
onPress: () => onStatusChange(null),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
);
|
||||||
}}
|
}}
|
||||||
disabled={isPending}
|
disabled={isPending}
|
||||||
accessibilityRole="button"
|
accessibilityRole="button"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import { Text } from "@/components/ui/text";
|
|||||||
import { usePressAnimation } from "@/hooks/use-press-animation";
|
import { usePressAnimation } from "@/hooks/use-press-animation";
|
||||||
import { titleActions } from "@/lib/title-actions";
|
import { titleActions } from "@/lib/title-actions";
|
||||||
|
|
||||||
type TitleStatus = "watchlist" | "in_progress" | "completed";
|
type TitleStatus = "in_watchlist" | "watching" | "caught_up" | "completed";
|
||||||
|
|
||||||
interface PosterCardProps {
|
interface PosterCardProps {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -61,8 +61,9 @@ export const PosterCard = memo(function PosterCard({
|
|||||||
const completedColor = useCSSVariable("--color-status-completed") as string;
|
const completedColor = useCSSVariable("--color-status-completed") as string;
|
||||||
|
|
||||||
const statusColors: Record<TitleStatus, string> = {
|
const statusColors: Record<TitleStatus, string> = {
|
||||||
watchlist: watchlistColor,
|
in_watchlist: watchlistColor,
|
||||||
in_progress: watchingColor,
|
watching: watchingColor,
|
||||||
|
caught_up: completedColor,
|
||||||
completed: completedColor,
|
completed: completedColor,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -79,11 +80,13 @@ export const PosterCard = memo(function PosterCard({
|
|||||||
const statusLabel =
|
const statusLabel =
|
||||||
userStatus === "completed"
|
userStatus === "completed"
|
||||||
? "completed"
|
? "completed"
|
||||||
: userStatus === "in_progress"
|
: userStatus === "caught_up"
|
||||||
? "watching"
|
? "caught up"
|
||||||
: userStatus === "watchlist"
|
: userStatus === "watching"
|
||||||
? "on watchlist"
|
? "watching"
|
||||||
: undefined;
|
: userStatus === "in_watchlist"
|
||||||
|
? "on watchlist"
|
||||||
|
: undefined;
|
||||||
const cardAccessibilityLabel = [title, type === "movie" ? "movie" : "TV show", year, statusLabel]
|
const cardAccessibilityLabel = [title, type === "movie" ? "movie" : "TV show", year, statusLabel]
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
.join(", ");
|
.join(", ");
|
||||||
@@ -119,9 +122,9 @@ export const PosterCard = memo(function PosterCard({
|
|||||||
className="absolute top-2 right-2 size-[30px] items-center justify-center rounded-full"
|
className="absolute top-2 right-2 size-[30px] items-center justify-center rounded-full"
|
||||||
style={{ backgroundColor: "rgba(0,0,0,0.5)" }}
|
style={{ backgroundColor: "rgba(0,0,0,0.5)" }}
|
||||||
>
|
>
|
||||||
{userStatus === "completed" ? (
|
{userStatus === "completed" || userStatus === "caught_up" ? (
|
||||||
<IconCheckbox size={16} color="white" />
|
<IconCheckbox size={16} color="white" />
|
||||||
) : userStatus === "in_progress" ? (
|
) : userStatus === "watching" ? (
|
||||||
<IconPlayerPlayFilled size={16} color="white" />
|
<IconPlayerPlayFilled size={16} color="white" />
|
||||||
) : (
|
) : (
|
||||||
<IconBookmarkFilled size={16} color="white" />
|
<IconBookmarkFilled size={16} color="white" />
|
||||||
@@ -214,13 +217,6 @@ export const PosterCard = memo(function PosterCard({
|
|||||||
onPress={handleQuickAddPress}
|
onPress={handleQuickAddPress}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{userStatus !== "in_progress" && (
|
|
||||||
<Link.MenuAction
|
|
||||||
title={t`Mark as Watching`}
|
|
||||||
icon="play.fill"
|
|
||||||
onPress={() => titleActions.markWatching(id)}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{type === "movie" && (
|
{type === "movie" && (
|
||||||
<Link.MenuAction
|
<Link.MenuAction
|
||||||
title={t`Mark as Watched`}
|
title={t`Mark as Watched`}
|
||||||
@@ -228,6 +224,13 @@ export const PosterCard = memo(function PosterCard({
|
|||||||
onPress={() => titleActions.markMovieWatched(id, title)}
|
onPress={() => titleActions.markMovieWatched(id, title)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{type === "tv" && userStatus && (
|
||||||
|
<Link.MenuAction
|
||||||
|
title={t`Mark All Watched`}
|
||||||
|
icon="checkmark.circle"
|
||||||
|
onPress={() => titleActions.markAllWatched(id, title)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
{userStatus && (
|
{userStatus && (
|
||||||
<Link.MenuAction
|
<Link.MenuAction
|
||||||
title={t`Remove from Library`}
|
title={t`Remove from Library`}
|
||||||
|
|||||||
@@ -57,8 +57,6 @@ export function useTitleActions(options?: UseTitleActionsOptions) {
|
|||||||
onSuccess: (_data, input) => {
|
onSuccess: (_data, input) => {
|
||||||
const statusMessages: Record<string, string> = {
|
const statusMessages: Record<string, string> = {
|
||||||
watchlist: t`Added to watchlist`,
|
watchlist: t`Added to watchlist`,
|
||||||
in_progress: t`Marked as watching`,
|
|
||||||
completed: t`Marked as completed`,
|
|
||||||
};
|
};
|
||||||
const defaultMsg = input.status
|
const defaultMsg = input.status
|
||||||
? (statusMessages[input.status] ?? t`Status updated`)
|
? (statusMessages[input.status] ?? t`Status updated`)
|
||||||
|
|||||||
@@ -32,30 +32,6 @@ export const titleActions = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
async markWatching(id: string) {
|
|
||||||
try {
|
|
||||||
await client.titles.updateStatus({ id, status: "in_progress" });
|
|
||||||
toast.success(i18n._(msg`Marked as watching`));
|
|
||||||
invalidateTitleQueries();
|
|
||||||
} catch {
|
|
||||||
toast.error(i18n._(msg`Failed to update status`));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
async markCompleted(id: string, titleName?: string) {
|
|
||||||
try {
|
|
||||||
await client.titles.updateStatus({ id, status: "completed" });
|
|
||||||
toast.success(
|
|
||||||
titleName
|
|
||||||
? i18n._(msg`Marked "${titleName}" as completed`)
|
|
||||||
: i18n._(msg`Marked as completed`),
|
|
||||||
);
|
|
||||||
invalidateTitleQueries();
|
|
||||||
} catch {
|
|
||||||
toast.error(i18n._(msg`Failed to update status`));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
async markMovieWatched(id: string, titleName?: string) {
|
async markMovieWatched(id: string, titleName?: string) {
|
||||||
try {
|
try {
|
||||||
await client.titles.watchMovie({ id });
|
await client.titles.watchMovie({ id });
|
||||||
@@ -112,6 +88,20 @@ export const titleActions = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async markAllWatched(id: string, titleName?: string) {
|
||||||
|
try {
|
||||||
|
await client.titles.watchAll({ id });
|
||||||
|
toast.success(
|
||||||
|
titleName
|
||||||
|
? i18n._(msg`Marked all episodes of "${titleName}" as watched`)
|
||||||
|
: i18n._(msg`Marked all episodes as watched`),
|
||||||
|
);
|
||||||
|
invalidateTitleQueries();
|
||||||
|
} catch {
|
||||||
|
toast.error(i18n._(msg`Failed to mark all episodes as watched`));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
async watchSeason(id: string, seasonName?: string) {
|
async watchSeason(id: string, seasonName?: string) {
|
||||||
try {
|
try {
|
||||||
await client.seasons.watch({ id });
|
await client.seasons.watch({ id });
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
getWatchCount,
|
getWatchCount,
|
||||||
getWatchHistory,
|
getWatchHistory,
|
||||||
} from "@sofa/core/discovery";
|
} from "@sofa/core/discovery";
|
||||||
|
import { getDisplayStatusesByTitleIds } from "@sofa/core/tracking";
|
||||||
import { tmdbImageUrl } from "@sofa/tmdb/image";
|
import { tmdbImageUrl } from "@sofa/tmdb/image";
|
||||||
|
|
||||||
import { os } from "../context";
|
import { os } from "../context";
|
||||||
@@ -48,6 +49,10 @@ export const library = os.dashboard.library.use(authed).handler(({ input, contex
|
|||||||
totalPages,
|
totalPages,
|
||||||
totalResults,
|
totalResults,
|
||||||
} = getLibraryFeed(context.user.id, input.page, input.limit);
|
} = getLibraryFeed(context.user.id, input.page, input.limit);
|
||||||
|
|
||||||
|
const titleIds = feed.map((t) => t.titleId);
|
||||||
|
const displayStatuses = getDisplayStatusesByTitleIds(context.user.id, titleIds);
|
||||||
|
|
||||||
const items = feed.map((t) => ({
|
const items = feed.map((t) => ({
|
||||||
id: t.titleId,
|
id: t.titleId,
|
||||||
tmdbId: t.tmdbId,
|
tmdbId: t.tmdbId,
|
||||||
@@ -58,7 +63,7 @@ export const library = os.dashboard.library.use(authed).handler(({ input, contex
|
|||||||
releaseDate: t.releaseDate ?? null,
|
releaseDate: t.releaseDate ?? null,
|
||||||
firstAirDate: t.firstAirDate ?? null,
|
firstAirDate: t.firstAirDate ?? null,
|
||||||
voteAverage: t.voteAverage,
|
voteAverage: t.voteAverage,
|
||||||
userStatus: t.userStatus,
|
userStatus: displayStatuses[t.titleId] ?? null,
|
||||||
}));
|
}));
|
||||||
return { items, page, totalPages, totalResults };
|
return { items, page, totalPages, totalResults };
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { ORPCError } from "@orpc/server";
|
|||||||
|
|
||||||
import { AppErrorCode } from "@sofa/api/errors";
|
import { AppErrorCode } from "@sofa/api/errors";
|
||||||
import { ensureBrowseTitlesExist } from "@sofa/core/metadata";
|
import { ensureBrowseTitlesExist } from "@sofa/core/metadata";
|
||||||
import { getEpisodeProgressByTitleIds, getUserStatusesByTitleIds } from "@sofa/core/tracking";
|
import { getEpisodeProgressByTitleIds, getDisplayStatusesByTitleIds } from "@sofa/core/tracking";
|
||||||
import { discover as discoverTmdb } from "@sofa/tmdb/client";
|
import { discover as discoverTmdb } from "@sofa/tmdb/client";
|
||||||
import { isTmdbConfigured } from "@sofa/tmdb/config";
|
import { isTmdbConfigured } from "@sofa/tmdb/config";
|
||||||
import { tmdbImageUrl } from "@sofa/tmdb/image";
|
import { tmdbImageUrl } from "@sofa/tmdb/image";
|
||||||
@@ -61,7 +61,7 @@ export const discover = os.discover.use(authed).handler(async ({ input, context
|
|||||||
const [userStatuses, episodeProgress] =
|
const [userStatuses, episodeProgress] =
|
||||||
titleIds.length > 0
|
titleIds.length > 0
|
||||||
? [
|
? [
|
||||||
getUserStatusesByTitleIds(context.user.id, titleIds),
|
getDisplayStatusesByTitleIds(context.user.id, titleIds),
|
||||||
getEpisodeProgressByTitleIds(context.user.id, titleIds),
|
getEpisodeProgressByTitleIds(context.user.id, titleIds),
|
||||||
]
|
]
|
||||||
: [{}, {}];
|
: [{}, {}];
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { ORPCError } from "@orpc/server";
|
|||||||
|
|
||||||
import { AppErrorCode } from "@sofa/api/errors";
|
import { AppErrorCode } from "@sofa/api/errors";
|
||||||
import { ensureBrowseTitlesExist } from "@sofa/core/metadata";
|
import { ensureBrowseTitlesExist } from "@sofa/core/metadata";
|
||||||
import { getEpisodeProgressByTitleIds, getUserStatusesByTitleIds } from "@sofa/core/tracking";
|
import { getEpisodeProgressByTitleIds, getDisplayStatusesByTitleIds } from "@sofa/core/tracking";
|
||||||
import { getGenres, getPopular, getTrending } from "@sofa/tmdb/client";
|
import { getGenres, getPopular, getTrending } from "@sofa/tmdb/client";
|
||||||
import { isTmdbConfigured } from "@sofa/tmdb/config";
|
import { isTmdbConfigured } from "@sofa/tmdb/config";
|
||||||
import { tmdbImageUrl } from "@sofa/tmdb/image";
|
import { tmdbImageUrl } from "@sofa/tmdb/image";
|
||||||
@@ -90,7 +90,7 @@ export const trending = os.explore.trending.use(authed).handler(async ({ input,
|
|||||||
const [userStatuses, episodeProgress] =
|
const [userStatuses, episodeProgress] =
|
||||||
titleIds.length > 0
|
titleIds.length > 0
|
||||||
? [
|
? [
|
||||||
getUserStatusesByTitleIds(context.user.id, titleIds),
|
getDisplayStatusesByTitleIds(context.user.id, titleIds),
|
||||||
getEpisodeProgressByTitleIds(context.user.id, titleIds),
|
getEpisodeProgressByTitleIds(context.user.id, titleIds),
|
||||||
]
|
]
|
||||||
: [{}, {}];
|
: [{}, {}];
|
||||||
@@ -136,7 +136,7 @@ export const popular = os.explore.popular.use(authed).handler(async ({ input, co
|
|||||||
const [userStatuses, episodeProgress] =
|
const [userStatuses, episodeProgress] =
|
||||||
titleIds.length > 0
|
titleIds.length > 0
|
||||||
? [
|
? [
|
||||||
getUserStatusesByTitleIds(context.user.id, titleIds),
|
getDisplayStatusesByTitleIds(context.user.id, titleIds),
|
||||||
getEpisodeProgressByTitleIds(context.user.id, titleIds),
|
getEpisodeProgressByTitleIds(context.user.id, titleIds),
|
||||||
]
|
]
|
||||||
: [{}, {}];
|
: [{}, {}];
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { ORPCError } from "@orpc/server";
|
|||||||
|
|
||||||
import { AppErrorCode } from "@sofa/api/errors";
|
import { AppErrorCode } from "@sofa/api/errors";
|
||||||
import { fetchFullFilmography, getOrFetchPerson } from "@sofa/core/person";
|
import { fetchFullFilmography, getOrFetchPerson } from "@sofa/core/person";
|
||||||
import { getUserStatusesByTitleIds } from "@sofa/core/tracking";
|
import { getDisplayStatusesByTitleIds } from "@sofa/core/tracking";
|
||||||
|
|
||||||
import { os } from "../context";
|
import { os } from "../context";
|
||||||
import { authed } from "../middleware";
|
import { authed } from "../middleware";
|
||||||
@@ -20,7 +20,7 @@ export const detail = os.people.detail.use(authed).handler(async ({ input, conte
|
|||||||
const start = (input.page - 1) * input.limit;
|
const start = (input.page - 1) * input.limit;
|
||||||
const pageCredits = allCredits.slice(start, start + input.limit);
|
const pageCredits = allCredits.slice(start, start + input.limit);
|
||||||
|
|
||||||
const userStatuses = getUserStatusesByTitleIds(
|
const userStatuses = getDisplayStatusesByTitleIds(
|
||||||
context.user.id,
|
context.user.id,
|
||||||
pageCredits.map((c) => c.titleId),
|
pageCredits.map((c) => c.titleId),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { AppErrorCode } from "@sofa/api/errors";
|
|||||||
import { getRecommendationsForTitle } from "@sofa/core/discovery";
|
import { getRecommendationsForTitle } from "@sofa/core/discovery";
|
||||||
import { getOrFetchTitle, getOrFetchTitleByTmdbId } from "@sofa/core/metadata";
|
import { getOrFetchTitle, getOrFetchTitleByTmdbId } from "@sofa/core/metadata";
|
||||||
import {
|
import {
|
||||||
getUserStatusesByTitleIds,
|
getDisplayStatusesByTitleIds,
|
||||||
getUserTitleInfo,
|
getUserTitleInfo,
|
||||||
logMovieWatch,
|
logMovieWatch,
|
||||||
markAllEpisodesWatched,
|
markAllEpisodesWatched,
|
||||||
@@ -48,14 +48,19 @@ export const watchAll = os.titles.watchAll.use(authed).handler(({ input, context
|
|||||||
});
|
});
|
||||||
|
|
||||||
export const userInfo = os.titles.userInfo.use(authed).handler(({ input, context }) => {
|
export const userInfo = os.titles.userInfo.use(authed).handler(({ input, context }) => {
|
||||||
return getUserTitleInfo(context.user.id, input.id);
|
const info = getUserTitleInfo(context.user.id, input.id);
|
||||||
|
if (!info.status) return { ...info, status: null };
|
||||||
|
|
||||||
|
// Convert stored status to display status
|
||||||
|
const displayStatuses = getDisplayStatusesByTitleIds(context.user.id, [input.id]);
|
||||||
|
return { ...info, status: displayStatuses[input.id] ?? null };
|
||||||
});
|
});
|
||||||
|
|
||||||
export const recommendations = os.titles.recommendations
|
export const recommendations = os.titles.recommendations
|
||||||
.use(authed)
|
.use(authed)
|
||||||
.handler(({ input, context }) => {
|
.handler(({ input, context }) => {
|
||||||
const recs = getRecommendationsForTitle(input.id);
|
const recs = getRecommendationsForTitle(input.id);
|
||||||
const userStatuses = getUserStatusesByTitleIds(
|
const userStatuses = getDisplayStatusesByTitleIds(
|
||||||
context.user.id,
|
context.user.id,
|
||||||
recs.map((r) => r.id),
|
recs.map((r) => r.id),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ interface TitleGridItem {
|
|||||||
releaseDate?: string | null;
|
releaseDate?: string | null;
|
||||||
firstAirDate?: string | null;
|
firstAirDate?: string | null;
|
||||||
voteAverage?: number | null;
|
voteAverage?: number | null;
|
||||||
userStatus?: "watchlist" | "in_progress" | "completed" | null;
|
userStatus?: "in_watchlist" | "watching" | "caught_up" | "completed" | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function TitleGridSectionSkeleton() {
|
export function TitleGridSectionSkeleton() {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ interface TitleRowItem {
|
|||||||
voteAverage: number | null;
|
voteAverage: number | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
type TitleStatus = "watchlist" | "in_progress" | "completed";
|
type TitleStatus = "in_watchlist" | "watching" | "caught_up" | "completed";
|
||||||
|
|
||||||
interface FilterableTitleRowProps {
|
interface FilterableTitleRowProps {
|
||||||
heading: string;
|
heading: string;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ interface TitleRowProps {
|
|||||||
heading: string;
|
heading: string;
|
||||||
icon: React.ReactNode;
|
icon: React.ReactNode;
|
||||||
items: TitleRowItem[];
|
items: TitleRowItem[];
|
||||||
userStatuses?: Record<string, "watchlist" | "in_progress" | "completed">;
|
userStatuses?: Record<string, "in_watchlist" | "watching" | "caught_up" | "completed">;
|
||||||
episodeProgress?: Record<string, { watched: number; total: number }>;
|
episodeProgress?: Record<string, { watched: number; total: number }>;
|
||||||
onEndReached?: () => void;
|
onEndReached?: () => void;
|
||||||
hasNextPage?: boolean;
|
hasNextPage?: boolean;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ type Sort = "newest" | "rating";
|
|||||||
|
|
||||||
interface FilmographyGridProps {
|
interface FilmographyGridProps {
|
||||||
credits: PersonCredit[];
|
credits: PersonCredit[];
|
||||||
userStatuses?: Record<string, "watchlist" | "in_progress" | "completed">;
|
userStatuses?: Record<string, "in_watchlist" | "watching" | "caught_up" | "completed">;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function FilmographyGrid({ credits, userStatuses }: FilmographyGridProps) {
|
export function FilmographyGrid({ credits, userStatuses }: FilmographyGridProps) {
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ export function PersonDetailClient({ id }: { id: string }) {
|
|||||||
() =>
|
() =>
|
||||||
Object.assign({}, ...(data?.pages.map((p) => p.userStatuses) ?? [])) as Record<
|
Object.assign({}, ...(data?.pages.map((p) => p.userStatuses) ?? [])) as Record<
|
||||||
string,
|
string,
|
||||||
"watchlist" | "in_progress" | "completed"
|
"in_watchlist" | "watching" | "caught_up" | "completed"
|
||||||
>,
|
>,
|
||||||
[data?.pages],
|
[data?.pages],
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ export function TitleCardSkeleton() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
type TitleStatus = "watchlist" | "in_progress" | "completed";
|
type TitleStatus = "in_watchlist" | "watching" | "caught_up" | "completed";
|
||||||
|
|
||||||
interface TiltStyles {
|
interface TiltStyles {
|
||||||
imageStyle: MotionStyle;
|
imageStyle: MotionStyle;
|
||||||
@@ -59,16 +59,21 @@ export interface TitleCardProps extends CardInnerProps {
|
|||||||
function useStatusConfig() {
|
function useStatusConfig() {
|
||||||
const { t } = useLingui();
|
const { t } = useLingui();
|
||||||
return {
|
return {
|
||||||
watchlist: {
|
in_watchlist: {
|
||||||
icon: IconBookmarkFilled,
|
icon: IconBookmarkFilled,
|
||||||
label: t`On Watchlist`,
|
label: t`On Watchlist`,
|
||||||
badgeClass: "bg-status-watching/90 text-white",
|
badgeClass: "bg-status-watching/90 text-white",
|
||||||
},
|
},
|
||||||
in_progress: {
|
watching: {
|
||||||
icon: IconPlayerPlayFilled,
|
icon: IconPlayerPlayFilled,
|
||||||
label: t`Watching`,
|
label: t`Watching`,
|
||||||
badgeClass: "bg-status-watching/90 text-white",
|
badgeClass: "bg-status-watching/90 text-white",
|
||||||
},
|
},
|
||||||
|
caught_up: {
|
||||||
|
icon: IconCircleCheckFilled,
|
||||||
|
label: t`Caught Up`,
|
||||||
|
badgeClass: "bg-status-watching/90 text-white",
|
||||||
|
},
|
||||||
completed: {
|
completed: {
|
||||||
icon: IconCircleCheckFilled,
|
icon: IconCircleCheckFilled,
|
||||||
label: t`Completed`,
|
label: t`Completed`,
|
||||||
@@ -91,7 +96,7 @@ function QuickAddButton({ id, userStatus }: { id: string; userStatus?: TitleStat
|
|||||||
|
|
||||||
const quickAddMutation = useMutation(
|
const quickAddMutation = useMutation(
|
||||||
orpc.titles.quickAdd.mutationOptions({
|
orpc.titles.quickAdd.mutationOptions({
|
||||||
onSuccess: () => setAddedStatus("watchlist"),
|
onSuccess: () => setAddedStatus("in_watchlist"),
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,24 @@
|
|||||||
import { useLingui } from "@lingui/react/macro";
|
import { Trans, useLingui } from "@lingui/react/macro";
|
||||||
import { IconCheck, IconPlayerPlayFilled, IconPlus, IconX } from "@tabler/icons-react";
|
import {
|
||||||
|
IconBookmarkFilled,
|
||||||
|
IconCheck,
|
||||||
|
IconPlayerPlayFilled,
|
||||||
|
IconPlus,
|
||||||
|
IconX,
|
||||||
|
} from "@tabler/icons-react";
|
||||||
import { AnimatePresence, motion } from "motion/react";
|
import { AnimatePresence, motion } from "motion/react";
|
||||||
|
import { useState } from "react";
|
||||||
|
|
||||||
|
import {
|
||||||
|
AlertDialog,
|
||||||
|
AlertDialogAction,
|
||||||
|
AlertDialogCancel,
|
||||||
|
AlertDialogContent,
|
||||||
|
AlertDialogDescription,
|
||||||
|
AlertDialogFooter,
|
||||||
|
AlertDialogHeader,
|
||||||
|
AlertDialogTitle,
|
||||||
|
} from "@/components/ui/alert-dialog";
|
||||||
|
|
||||||
interface StatusButtonProps {
|
interface StatusButtonProps {
|
||||||
currentStatus: string | null;
|
currentStatus: string | null;
|
||||||
@@ -9,75 +27,120 @@ interface StatusButtonProps {
|
|||||||
|
|
||||||
export function StatusButton({ currentStatus, onChange }: StatusButtonProps) {
|
export function StatusButton({ currentStatus, onChange }: StatusButtonProps) {
|
||||||
const { t } = useLingui();
|
const { t } = useLingui();
|
||||||
|
const [confirmOpen, setConfirmOpen] = useState(false);
|
||||||
|
|
||||||
const watchingStyle = {
|
const completedStyle = {
|
||||||
label: t`Watching`,
|
class: "text-status-completed",
|
||||||
icon: IconPlayerPlayFilled,
|
bgClass: "bg-status-completed/10 hover:bg-status-completed/15",
|
||||||
class: "text-status-watching",
|
borderClass: "ring-status-completed/20",
|
||||||
bgClass: "bg-status-watching/10 hover:bg-status-watching/15",
|
|
||||||
borderClass: "ring-status-watching/20",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const statusConfig = {
|
const statusConfig = {
|
||||||
watchlist: watchingStyle,
|
in_watchlist: {
|
||||||
in_progress: watchingStyle,
|
label: t`In Watchlist`,
|
||||||
|
icon: IconBookmarkFilled,
|
||||||
|
class: "text-primary",
|
||||||
|
bgClass: "bg-primary/10 hover:bg-primary/15",
|
||||||
|
borderClass: "ring-primary/20",
|
||||||
|
},
|
||||||
|
watching: {
|
||||||
|
label: t`Watching`,
|
||||||
|
icon: IconPlayerPlayFilled,
|
||||||
|
class: "text-status-watching",
|
||||||
|
bgClass: "bg-status-watching/10 hover:bg-status-watching/15",
|
||||||
|
borderClass: "ring-status-watching/20",
|
||||||
|
},
|
||||||
|
caught_up: {
|
||||||
|
label: t`Caught Up`,
|
||||||
|
icon: IconCheck,
|
||||||
|
...completedStyle,
|
||||||
|
},
|
||||||
completed: {
|
completed: {
|
||||||
label: t`Completed`,
|
label: t`Completed`,
|
||||||
icon: IconCheck,
|
icon: IconCheck,
|
||||||
class: "text-status-completed",
|
...completedStyle,
|
||||||
bgClass: "bg-status-completed/10 hover:bg-status-completed/15",
|
|
||||||
borderClass: "ring-status-completed/20",
|
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
const config = statusConfig[currentStatus as keyof typeof statusConfig] ?? null;
|
const config = statusConfig[currentStatus as keyof typeof statusConfig] ?? null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AnimatePresence mode="wait" initial={false}>
|
<>
|
||||||
{!config ? (
|
<AnimatePresence mode="wait" initial={false}>
|
||||||
<motion.button
|
{!config ? (
|
||||||
key="add"
|
<motion.button
|
||||||
type="button"
|
key="add"
|
||||||
onClick={() => onChange("watchlist")}
|
type="button"
|
||||||
initial={{ opacity: 0, y: 4 }}
|
onClick={() => onChange("watchlist")}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
initial={{ opacity: 0, y: 4 }}
|
||||||
exit={{ opacity: 0, y: -4 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.15 }}
|
exit={{ opacity: 0, y: -4 }}
|
||||||
className="bg-primary/10 text-primary ring-primary/20 hover:bg-primary/15 hover:ring-primary/30 inline-flex h-9 items-center gap-2 rounded-lg px-4 text-sm font-medium ring-1 transition-all active:scale-[0.97]"
|
transition={{ duration: 0.15 }}
|
||||||
>
|
className="bg-primary/10 text-primary ring-primary/20 hover:bg-primary/15 hover:ring-primary/30 inline-flex h-9 items-center gap-2 rounded-lg px-4 text-sm font-medium ring-1 transition-all active:scale-[0.97]"
|
||||||
<IconPlus aria-hidden={true} className="size-3.5" strokeWidth={2.5} />
|
>
|
||||||
{t`Watchlist`}
|
<IconPlus aria-hidden={true} className="size-3.5" strokeWidth={2.5} />
|
||||||
</motion.button>
|
{t`Watchlist`}
|
||||||
) : (
|
</motion.button>
|
||||||
<motion.button
|
) : (
|
||||||
key="status"
|
<motion.button
|
||||||
type="button"
|
key="status"
|
||||||
onClick={() => onChange(null)}
|
type="button"
|
||||||
initial={{ opacity: 0, y: 4 }}
|
onClick={() => setConfirmOpen(true)}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
initial={{ opacity: 0, y: 4 }}
|
||||||
exit={{ opacity: 0, y: -4 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 0.15 }}
|
exit={{ opacity: 0, y: -4 }}
|
||||||
title={t`Remove from library`}
|
transition={{ duration: 0.15 }}
|
||||||
className={`group inline-flex h-9 items-center gap-2 rounded-lg px-4 text-sm font-medium ring-1 transition-all active:scale-[0.97] ${config.class} ${config.bgClass} ${config.borderClass} hover:!bg-destructive/10 hover:!text-destructive hover:!ring-destructive/30`}
|
title={t`Remove from library`}
|
||||||
>
|
className={`group inline-flex h-9 items-center gap-2 rounded-lg px-4 text-sm font-medium ring-1 transition-all active:scale-[0.97] ${config.class} ${config.bgClass} ${config.borderClass} hover:!bg-destructive/10 hover:!text-destructive hover:!ring-destructive/30`}
|
||||||
<span className="grid [&>svg]:col-start-1 [&>svg]:row-start-1">
|
>
|
||||||
<config.icon
|
<span className="grid [&>svg]:col-start-1 [&>svg]:row-start-1">
|
||||||
aria-hidden={true}
|
<config.icon
|
||||||
className="size-3.5 transition-opacity group-hover:opacity-0"
|
aria-hidden={true}
|
||||||
/>
|
className="size-3.5 transition-opacity group-hover:opacity-0"
|
||||||
<IconX
|
/>
|
||||||
aria-hidden={true}
|
<IconX
|
||||||
className="text-destructive size-3.5 opacity-0 transition-opacity group-hover:opacity-100"
|
aria-hidden={true}
|
||||||
/>
|
className="text-destructive size-3.5 opacity-0 transition-opacity group-hover:opacity-100"
|
||||||
</span>
|
/>
|
||||||
<span className="grid [&>span]:col-start-1 [&>span]:row-start-1">
|
|
||||||
<span className="transition-opacity group-hover:opacity-0">{config.label}</span>
|
|
||||||
<span className="opacity-0 transition-opacity group-hover:opacity-100">
|
|
||||||
{t`Remove`}
|
|
||||||
</span>
|
</span>
|
||||||
</span>
|
<span className="grid [&>span]:col-start-1 [&>span]:row-start-1">
|
||||||
</motion.button>
|
<span className="transition-opacity group-hover:opacity-0">{config.label}</span>
|
||||||
)}
|
<span className="opacity-0 transition-opacity group-hover:opacity-100">
|
||||||
</AnimatePresence>
|
{t`Remove`}
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</motion.button>
|
||||||
|
)}
|
||||||
|
</AnimatePresence>
|
||||||
|
|
||||||
|
<AlertDialog open={confirmOpen} onOpenChange={setConfirmOpen}>
|
||||||
|
<AlertDialogContent>
|
||||||
|
<AlertDialogHeader>
|
||||||
|
<AlertDialogTitle>
|
||||||
|
<Trans>Remove from library?</Trans>
|
||||||
|
</AlertDialogTitle>
|
||||||
|
<AlertDialogDescription>
|
||||||
|
<Trans>
|
||||||
|
This title will be removed from your library. Your watch history and ratings will be
|
||||||
|
kept.
|
||||||
|
</Trans>
|
||||||
|
</AlertDialogDescription>
|
||||||
|
</AlertDialogHeader>
|
||||||
|
<AlertDialogFooter>
|
||||||
|
<AlertDialogCancel>
|
||||||
|
<Trans>Cancel</Trans>
|
||||||
|
</AlertDialogCancel>
|
||||||
|
<AlertDialogAction
|
||||||
|
onClick={() => {
|
||||||
|
onChange(null);
|
||||||
|
setConfirmOpen(false);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Trans>Remove</Trans>
|
||||||
|
</AlertDialogAction>
|
||||||
|
</AlertDialogFooter>
|
||||||
|
</AlertDialogContent>
|
||||||
|
</AlertDialog>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import type { Season } from "@sofa/api/schemas";
|
|||||||
import { useTitleContext } from "./title-context";
|
import { useTitleContext } from "./title-context";
|
||||||
|
|
||||||
type UserInfo = {
|
type UserInfo = {
|
||||||
status: "watchlist" | "in_progress" | "completed" | null;
|
status: "in_watchlist" | "watching" | "caught_up" | "completed" | null;
|
||||||
rating: number | null;
|
rating: number | null;
|
||||||
episodeWatches: string[];
|
episodeWatches: string[];
|
||||||
};
|
};
|
||||||
@@ -57,17 +57,14 @@ export function useTitleActions() {
|
|||||||
for (const id of episodeIds) newWatchSet.add(id);
|
for (const id of episodeIds) newWatchSet.add(id);
|
||||||
const newWatches = [...newWatchSet];
|
const newWatches = [...newWatchSet];
|
||||||
|
|
||||||
const allEpIds = seasons.flatMap((s) => s.episodes.map((ep) => ep.id));
|
|
||||||
const allWatched = allEpIds.every((id) => newWatchSet.has(id));
|
|
||||||
|
|
||||||
setUserInfo((old) => ({
|
setUserInfo((old) => ({
|
||||||
...old,
|
...old,
|
||||||
episodeWatches: newWatches,
|
episodeWatches: newWatches,
|
||||||
status: allWatched ? "completed" : old.status,
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await batchWatchMutation.mutateAsync({ episodeIds });
|
await batchWatchMutation.mutateAsync({ episodeIds });
|
||||||
|
await queryClient.invalidateQueries({ queryKey: userInfoKey });
|
||||||
toast.success(
|
toast.success(
|
||||||
t`Caught up — marked ${episodeIds.length} ${plural(episodeIds.length, { one: "episode", other: "episodes" })} as watched`,
|
t`Caught up — marked ${episodeIds.length} ${plural(episodeIds.length, { one: "episode", other: "episodes" })} as watched`,
|
||||||
);
|
);
|
||||||
@@ -80,7 +77,7 @@ export function useTitleActions() {
|
|||||||
toast.error(t`Failed to catch up`);
|
toast.error(t`Failed to catch up`);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[getUserInfo, setUserInfo, seasons, batchWatchMutation, t],
|
[getUserInfo, setUserInfo, batchWatchMutation, queryClient, userInfoKey, t],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleStatusChange = useCallback(
|
const handleStatusChange = useCallback(
|
||||||
@@ -88,12 +85,12 @@ export function useTitleActions() {
|
|||||||
const prevStatus = getUserInfo().status;
|
const prevStatus = getUserInfo().status;
|
||||||
setUserInfo((old) => ({
|
setUserInfo((old) => ({
|
||||||
...old,
|
...old,
|
||||||
status: status === "watchlist" ? "in_progress" : (status as UserInfo["status"]),
|
status: status ? "in_watchlist" : null,
|
||||||
}));
|
}));
|
||||||
try {
|
try {
|
||||||
await updateStatusMutation.mutateAsync({
|
await updateStatusMutation.mutateAsync({
|
||||||
id: titleId,
|
id: titleId,
|
||||||
status: status ? "in_progress" : null,
|
status: status ? "watchlist" : null,
|
||||||
});
|
});
|
||||||
toast.success(status ? t`Added to watchlist` : t`Removed from library`);
|
toast.success(status ? t`Added to watchlist` : t`Removed from library`);
|
||||||
} catch {
|
} catch {
|
||||||
@@ -148,7 +145,8 @@ export function useTitleActions() {
|
|||||||
setUserInfo((old) => ({
|
setUserInfo((old) => ({
|
||||||
...old,
|
...old,
|
||||||
episodeWatches: old.episodeWatches.filter((id) => id !== episodeId),
|
episodeWatches: old.episodeWatches.filter((id) => id !== episodeId),
|
||||||
status: old.status === "completed" ? "in_progress" : old.status,
|
status:
|
||||||
|
old.status === "completed" || old.status === "caught_up" ? "watching" : old.status,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -173,7 +171,7 @@ export function useTitleActions() {
|
|||||||
setUserInfo((old) => ({
|
setUserInfo((old) => ({
|
||||||
...old,
|
...old,
|
||||||
episodeWatches: newWatches,
|
episodeWatches: newWatches,
|
||||||
status: old.status === null || old.status === "watchlist" ? "in_progress" : old.status,
|
status: old.status === null || old.status === "in_watchlist" ? "watching" : old.status,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -243,21 +241,15 @@ export function useTitleActions() {
|
|||||||
for (const ep of unwatched) newWatchSet.add(ep.id);
|
for (const ep of unwatched) newWatchSet.add(ep.id);
|
||||||
const newWatches = [...newWatchSet];
|
const newWatches = [...newWatchSet];
|
||||||
|
|
||||||
const allEpIds = seasons.flatMap((s) => s.episodes.map((ep) => ep.id));
|
|
||||||
const allWatched = allEpIds.every((id) => newWatchSet.has(id));
|
|
||||||
|
|
||||||
setUserInfo((old) => ({
|
setUserInfo((old) => ({
|
||||||
...old,
|
...old,
|
||||||
episodeWatches: newWatches,
|
episodeWatches: newWatches,
|
||||||
status: allWatched
|
status: old.status === null || old.status === "in_watchlist" ? "watching" : old.status,
|
||||||
? "completed"
|
|
||||||
: old.status === null || old.status === "watchlist"
|
|
||||||
? "in_progress"
|
|
||||||
: old.status,
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await watchSeasonMutation.mutateAsync({ id: season.id });
|
await watchSeasonMutation.mutateAsync({ id: season.id });
|
||||||
|
await queryClient.invalidateQueries({ queryKey: userInfoKey });
|
||||||
|
|
||||||
const currentWatchSet = new Set(getUserInfo().episodeWatches);
|
const currentWatchSet = new Set(getUserInfo().episodeWatches);
|
||||||
const previousUnwatched: string[] = [];
|
const previousUnwatched: string[] = [];
|
||||||
@@ -294,7 +286,7 @@ export function useTitleActions() {
|
|||||||
toast.error(t`Failed to mark some episodes`);
|
toast.error(t`Failed to mark some episodes`);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[getUserInfo, setUserInfo, seasons, catchUp, watchSeasonMutation, t],
|
[getUserInfo, setUserInfo, seasons, catchUp, watchSeasonMutation, queryClient, userInfoKey, t],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleUnmarkSeason = useCallback(
|
const handleUnmarkSeason = useCallback(
|
||||||
@@ -305,7 +297,7 @@ export function useTitleActions() {
|
|||||||
setUserInfo((old) => ({
|
setUserInfo((old) => ({
|
||||||
...old,
|
...old,
|
||||||
episodeWatches: old.episodeWatches.filter((id) => !seasonEpIds.has(id)),
|
episodeWatches: old.episodeWatches.filter((id) => !seasonEpIds.has(id)),
|
||||||
status: old.status === "completed" ? "in_progress" : old.status,
|
status: old.status === "completed" || old.status === "caught_up" ? "watching" : old.status,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -330,10 +322,12 @@ export function useTitleActions() {
|
|||||||
setUserInfo((old) => ({
|
setUserInfo((old) => ({
|
||||||
...old,
|
...old,
|
||||||
episodeWatches: allEpIds,
|
episodeWatches: allEpIds,
|
||||||
status: "completed",
|
status: old.status ?? "watching",
|
||||||
}));
|
}));
|
||||||
try {
|
try {
|
||||||
await watchAllMutation.mutateAsync({ id: titleId });
|
await watchAllMutation.mutateAsync({ id: titleId });
|
||||||
|
// Refresh to get server-derived display status (caught_up / completed)
|
||||||
|
await queryClient.invalidateQueries({ queryKey: userInfoKey });
|
||||||
toast.success(t`Marked all episodes as watched`);
|
toast.success(t`Marked all episodes as watched`);
|
||||||
} catch {
|
} catch {
|
||||||
setUserInfo((old) => ({
|
setUserInfo((old) => ({
|
||||||
@@ -343,7 +337,7 @@ export function useTitleActions() {
|
|||||||
}));
|
}));
|
||||||
toast.error(t`Failed to mark all episodes as watched`);
|
toast.error(t`Failed to mark all episodes as watched`);
|
||||||
}
|
}
|
||||||
}, [getUserInfo, setUserInfo, seasons, titleId, watchAllMutation, t]);
|
}, [getUserInfo, setUserInfo, seasons, titleId, watchAllMutation, queryClient, userInfoKey, t]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
handleStatusChange,
|
handleStatusChange,
|
||||||
|
|||||||
@@ -7,7 +7,8 @@
|
|||||||
"./contract": "./src/contract.ts",
|
"./contract": "./src/contract.ts",
|
||||||
"./schemas": "./src/schemas.ts",
|
"./schemas": "./src/schemas.ts",
|
||||||
"./errors": "./src/errors.ts",
|
"./errors": "./src/errors.ts",
|
||||||
"./utils": "./src/utils.ts"
|
"./utils": "./src/utils.ts",
|
||||||
|
"./display-status": "./src/display-status.ts"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "oxlint",
|
"lint": "oxlint",
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
export type StoredStatus = "watchlist" | "in_progress" | "completed";
|
||||||
|
|
||||||
|
export type DisplayStatus = "in_watchlist" | "watching" | "caught_up" | "completed";
|
||||||
|
|
||||||
|
export const ONGOING_TMDB_STATUSES = ["Returning Series", "In Production"];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Derive the user-facing display status from stored status + context.
|
||||||
|
*
|
||||||
|
* Movies: watchlist → in_watchlist, completed → completed
|
||||||
|
* TV: watchlist → in_watchlist, in_progress → watching | caught_up | completed
|
||||||
|
*/
|
||||||
|
export function getDisplayStatus(
|
||||||
|
storedStatus: StoredStatus,
|
||||||
|
titleType: "movie" | "tv",
|
||||||
|
tmdbStatus: string | null,
|
||||||
|
episodeProgress: { watched: number; total: number } | null,
|
||||||
|
): DisplayStatus {
|
||||||
|
if (storedStatus === "watchlist") return "in_watchlist";
|
||||||
|
if (titleType === "movie") return storedStatus === "completed" ? "completed" : "in_watchlist";
|
||||||
|
|
||||||
|
// TV with in_progress: derive from episode progress + TMDB show status
|
||||||
|
if (
|
||||||
|
episodeProgress &&
|
||||||
|
episodeProgress.total > 0 &&
|
||||||
|
episodeProgress.watched >= episodeProgress.total
|
||||||
|
) {
|
||||||
|
return ONGOING_TMDB_STATUSES.includes(tmdbStatus ?? "") ? "caught_up" : "completed";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "watching";
|
||||||
|
}
|
||||||
+10
-12
@@ -50,13 +50,13 @@ export const UpdateStatusInput = z
|
|||||||
.object({
|
.object({
|
||||||
id: z.string().min(1).describe("Title ID"),
|
id: z.string().min(1).describe("Title ID"),
|
||||||
status: z
|
status: z
|
||||||
.enum(["in_progress", "completed"])
|
.enum(["watchlist"])
|
||||||
.nullable()
|
.nullable()
|
||||||
.describe(
|
.describe(
|
||||||
"Tracking status: in_progress (currently watching), completed (finished), or null to remove from library",
|
"Set to watchlist to add to library, or null to remove. Other transitions happen via watch endpoints.",
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
.meta({ description: "Update the user's tracking status for a title" });
|
.meta({ description: "Add a title to the user's watchlist or remove from library" });
|
||||||
|
|
||||||
export const UpdateRatingInput = z
|
export const UpdateRatingInput = z
|
||||||
.object({
|
.object({
|
||||||
@@ -391,9 +391,11 @@ export const RecommendationItemSchema = z
|
|||||||
})
|
})
|
||||||
.meta({ description: "A recommended title" });
|
.meta({ description: "A recommended title" });
|
||||||
|
|
||||||
|
const displayStatusEnum = z.enum(["in_watchlist", "watching", "caught_up", "completed"]);
|
||||||
|
|
||||||
const userStatusMap = z
|
const userStatusMap = z
|
||||||
.record(z.string(), z.enum(["watchlist", "in_progress", "completed"]))
|
.record(z.string(), displayStatusEnum)
|
||||||
.describe("Map of title ID to the user's tracking status");
|
.describe("Map of title ID to the user's display status");
|
||||||
const episodeProgressMap = z
|
const episodeProgressMap = z
|
||||||
.record(z.string(), z.object({ watched: z.number(), total: z.number() }))
|
.record(z.string(), z.object({ watched: z.number(), total: z.number() }))
|
||||||
.describe("Map of title ID to episode watch progress");
|
.describe("Map of title ID to episode watch progress");
|
||||||
@@ -425,10 +427,9 @@ export const TitleDetailOutput = z
|
|||||||
|
|
||||||
export const UserInfoOutput = z
|
export const UserInfoOutput = z
|
||||||
.object({
|
.object({
|
||||||
status: z
|
status: displayStatusEnum
|
||||||
.enum(["watchlist", "in_progress", "completed"])
|
|
||||||
.nullable()
|
.nullable()
|
||||||
.describe("User's tracking status, or null if not in library"),
|
.describe("User's display status, or null if not in library"),
|
||||||
rating: z.number().nullable().describe("User's star rating (0-5), or null if unrated"),
|
rating: z.number().nullable().describe("User's star rating (0-5), or null if unrated"),
|
||||||
episodeWatches: z.array(z.string()).describe("IDs of episodes the user has watched"),
|
episodeWatches: z.array(z.string()).describe("IDs of episodes the user has watched"),
|
||||||
})
|
})
|
||||||
@@ -523,10 +524,7 @@ export const LibraryOutput = z
|
|||||||
releaseDate: z.string().nullable().describe("Release date (ISO 8601)"),
|
releaseDate: z.string().nullable().describe("Release date (ISO 8601)"),
|
||||||
firstAirDate: z.string().nullable().describe("First air date (ISO 8601)"),
|
firstAirDate: z.string().nullable().describe("First air date (ISO 8601)"),
|
||||||
voteAverage: z.number().nullable().describe("Average rating (0-10)"),
|
voteAverage: z.number().nullable().describe("Average rating (0-10)"),
|
||||||
userStatus: z
|
userStatus: displayStatusEnum.nullable().describe("User's display status"),
|
||||||
.enum(["watchlist", "in_progress", "completed"])
|
|
||||||
.nullable()
|
|
||||||
.describe("User's tracking status"),
|
|
||||||
})
|
})
|
||||||
.meta({ description: "A library item with user status" }),
|
.meta({ description: "A library item with user status" }),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
getAllTrackedTitleIds,
|
getAllTrackedTitleIds,
|
||||||
getCompletedTitleIds,
|
getEngagedTitleIds,
|
||||||
getEpisodesBySeasonIds,
|
getEpisodesBySeasonIds,
|
||||||
getEpisodeWatchCountSince,
|
getEpisodeWatchCountSince,
|
||||||
getEpisodeWatchesByEpisodeIds,
|
getEpisodeWatchesByEpisodeIds,
|
||||||
@@ -299,7 +299,7 @@ export { getLibraryFeed } from "@sofa/db/queries/discovery";
|
|||||||
|
|
||||||
export function getRecommendationsFeed(userId: string) {
|
export function getRecommendationsFeed(userId: string) {
|
||||||
// Get recommendations from user's highly-rated or completed titles
|
// Get recommendations from user's highly-rated or completed titles
|
||||||
const userCompletedOrRated = getCompletedTitleIds(userId);
|
const userCompletedOrRated = getEngagedTitleIds(userId);
|
||||||
|
|
||||||
const ratedIds = getHighlyRatedTitleIds(userId);
|
const ratedIds = getHighlyRatedTitleIds(userId);
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,11 @@ export async function getSonarrList(
|
|||||||
userId: string,
|
userId: string,
|
||||||
statuses: Status[] = ["watchlist"],
|
statuses: Status[] = ["watchlist"],
|
||||||
): Promise<{ TvdbId: number; Title: string }[]> {
|
): Promise<{ TvdbId: number; Title: string }[]> {
|
||||||
const rows = getSonarrShows(userId, statuses);
|
// TV never stores 'completed' — map it to 'in_progress' (completion is derived)
|
||||||
|
const mappedStatuses = [
|
||||||
|
...new Set(statuses.map((s) => (s === "completed" ? "in_progress" : s))),
|
||||||
|
] as Status[];
|
||||||
|
const rows = getSonarrShows(userId, mappedStatuses);
|
||||||
|
|
||||||
// Resolve missing TVDB IDs in parallel instead of sequentially
|
// Resolve missing TVDB IDs in parallel instead of sequentially
|
||||||
const needsResolution = rows.filter((r) => r.tvdbId == null);
|
const needsResolution = rows.filter((r) => r.tvdbId == null);
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
import type { DisplayStatus } from "@sofa/api/display-status";
|
||||||
|
import { getDisplayStatus } from "@sofa/api/display-status";
|
||||||
|
import { getTitlesByIds } from "@sofa/db/queries/discovery";
|
||||||
import { getTitleById } from "@sofa/db/queries/title";
|
import { getTitleById } from "@sofa/db/queries/title";
|
||||||
import {
|
import {
|
||||||
batchInsertEpisodeWatchesTransaction,
|
batchInsertEpisodeWatchesTransaction,
|
||||||
@@ -64,19 +67,16 @@ export function logEpisodeWatch(
|
|||||||
const now = watchedAt ?? new Date();
|
const now = watchedAt ?? new Date();
|
||||||
insertEpisodeWatch(userId, episodeId, now, source);
|
insertEpisodeWatch(userId, episodeId, now, source);
|
||||||
|
|
||||||
// Find the title for this episode (single JOIN instead of 2 queries)
|
// Find the title for this episode
|
||||||
const titleId = getEpisodeTitleId(episodeId);
|
const titleId = getEpisodeTitleId(episodeId);
|
||||||
if (!titleId) return;
|
if (!titleId) return;
|
||||||
|
|
||||||
// Auto-set status to in_progress if not set
|
// Auto-set status to in_progress if not set or still on watchlist
|
||||||
const existing = getTitleStatus(userId, titleId);
|
const existing = getTitleStatus(userId, titleId);
|
||||||
|
|
||||||
if (!existing || existing.status === "watchlist") {
|
if (!existing || existing.status === "watchlist") {
|
||||||
setTitleStatus(userId, titleId, "in_progress", source);
|
setTitleStatus(userId, titleId, "in_progress", source);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if all episodes are watched -> auto-complete
|
|
||||||
checkAllEpisodesWatched(userId, titleId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function logEpisodeWatchBatch(
|
export function logEpisodeWatchBatch(
|
||||||
@@ -104,33 +104,24 @@ export function markAllEpisodesWatched(
|
|||||||
|
|
||||||
batchInsertMissingEpisodeWatches(userId, epIds, existingWatches, source, now);
|
batchInsertMissingEpisodeWatches(userId, epIds, existingWatches, source, now);
|
||||||
|
|
||||||
setTitleStatus(userId, titleId, "completed", source);
|
// TV never stores 'completed' — set in_progress and let display status derive the rest
|
||||||
}
|
setTitleStatus(userId, titleId, "in_progress", source);
|
||||||
|
|
||||||
function checkAllEpisodesWatched(userId: string, titleId: string) {
|
|
||||||
const epIds = getAllEpisodeIdsForTitle(titleId);
|
|
||||||
|
|
||||||
const totalEpisodes = epIds.length;
|
|
||||||
if (totalEpisodes === 0) return;
|
|
||||||
|
|
||||||
const watchCount = countDistinctEpisodeWatches(userId, epIds);
|
|
||||||
|
|
||||||
if (watchCount >= totalEpisodes) {
|
|
||||||
setTitleStatus(userId, titleId, "completed");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function unwatchEpisode(userId: string, episodeId: string) {
|
export function unwatchEpisode(userId: string, episodeId: string) {
|
||||||
deleteEpisodeWatch(userId, episodeId);
|
deleteEpisodeWatch(userId, episodeId);
|
||||||
|
|
||||||
// Find parent title and downgrade from completed to in_progress
|
|
||||||
const titleId = getEpisodeTitleId(episodeId);
|
const titleId = getEpisodeTitleId(episodeId);
|
||||||
if (!titleId) return;
|
if (!titleId) return;
|
||||||
|
|
||||||
const existing = getTitleStatus(userId, titleId);
|
const existing = getTitleStatus(userId, titleId);
|
||||||
|
if (!existing || existing.status !== "in_progress") return;
|
||||||
|
|
||||||
if (existing?.status === "completed") {
|
// If no episodes remain watched, downgrade to watchlist
|
||||||
setTitleStatus(userId, titleId, "in_progress");
|
const epIds = getAllEpisodeIdsForTitle(titleId);
|
||||||
|
const watchCount = countDistinctEpisodeWatches(userId, epIds);
|
||||||
|
if (watchCount === 0) {
|
||||||
|
setTitleStatus(userId, titleId, "watchlist");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,14 +133,17 @@ export function unwatchSeason(userId: string, seasonId: string) {
|
|||||||
deleteEpisodeWatches(userId, epIds);
|
deleteEpisodeWatches(userId, epIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find parent title and downgrade from completed to in_progress
|
|
||||||
const season = getSeasonById(seasonId);
|
const season = getSeasonById(seasonId);
|
||||||
if (!season) return;
|
if (!season) return;
|
||||||
|
|
||||||
const existing = getTitleStatus(userId, season.titleId);
|
const existing = getTitleStatus(userId, season.titleId);
|
||||||
|
if (!existing || existing.status !== "in_progress") return;
|
||||||
|
|
||||||
if (existing?.status === "completed") {
|
// If no episodes remain watched, downgrade to watchlist
|
||||||
setTitleStatus(userId, season.titleId, "in_progress");
|
const allEpIds = getAllEpisodeIdsForTitle(season.titleId);
|
||||||
|
const watchCount = countDistinctEpisodeWatches(userId, allEpIds);
|
||||||
|
if (watchCount === 0) {
|
||||||
|
setTitleStatus(userId, season.titleId, "watchlist");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,6 +176,46 @@ export function getUserStatusesByTitleIds(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Derive display statuses for a set of titles.
|
||||||
|
* Resolves stored status + episode progress + TMDB show status into display status.
|
||||||
|
*/
|
||||||
|
export function getDisplayStatusesByTitleIds(
|
||||||
|
userId: string,
|
||||||
|
titleIds: string[],
|
||||||
|
): Record<string, DisplayStatus> {
|
||||||
|
if (titleIds.length === 0) return {};
|
||||||
|
|
||||||
|
const storedStatuses = getUserStatusesByTitleIds(userId, titleIds);
|
||||||
|
const statusEntries = Object.entries(storedStatuses);
|
||||||
|
if (statusEntries.length === 0) return {};
|
||||||
|
|
||||||
|
// Find TV titles with in_progress status that need episode progress resolution
|
||||||
|
const tvInProgressIds = statusEntries
|
||||||
|
.filter(([, status]) => status === "in_progress")
|
||||||
|
.map(([id]) => id);
|
||||||
|
|
||||||
|
// Fetch title data for type + TMDB status
|
||||||
|
const trackedIds = statusEntries.map(([id]) => id);
|
||||||
|
const titles = getTitlesByIds(trackedIds);
|
||||||
|
const titleMap = new Map(titles.map((t) => [t.id, t]));
|
||||||
|
|
||||||
|
// Fetch episode progress for TV in_progress titles
|
||||||
|
const episodeProgress =
|
||||||
|
tvInProgressIds.length > 0 ? getEpisodeProgressByTitleIds(userId, tvInProgressIds) : {};
|
||||||
|
|
||||||
|
const result: Record<string, DisplayStatus> = {};
|
||||||
|
for (const [titleId, storedStatus] of statusEntries) {
|
||||||
|
const title = titleMap.get(titleId);
|
||||||
|
const titleType = (title?.type ?? "movie") as "movie" | "tv";
|
||||||
|
const tmdbStatus = title?.status ?? null;
|
||||||
|
const progress = episodeProgress[titleId] ?? null;
|
||||||
|
|
||||||
|
result[titleId] = getDisplayStatus(storedStatus, titleType, tmdbStatus, progress);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
export function getEpisodeProgressByTitleIds(
|
export function getEpisodeProgressByTitleIds(
|
||||||
userId: string,
|
userId: string,
|
||||||
titleIds: string[],
|
titleIds: string[],
|
||||||
|
|||||||
@@ -193,11 +193,12 @@ describe("getSonarrList", () => {
|
|||||||
title: "Show B",
|
title: "Show B",
|
||||||
});
|
});
|
||||||
insertStatus("user-1", "tv1", "watchlist");
|
insertStatus("user-1", "tv1", "watchlist");
|
||||||
insertStatus("user-1", "tv2", "completed");
|
insertStatus("user-1", "tv2", "in_progress");
|
||||||
|
|
||||||
const watchlist = await getSonarrList("user-1", ["watchlist"]);
|
const watchlist = await getSonarrList("user-1", ["watchlist"]);
|
||||||
expect(watchlist).toEqual([{ TvdbId: 111, Title: "Show A" }]);
|
expect(watchlist).toEqual([{ TvdbId: 111, Title: "Show A" }]);
|
||||||
|
|
||||||
|
// 'completed' maps to 'in_progress' for TV (completion is derived)
|
||||||
const all = await getSonarrList("user-1", ["watchlist", "completed"]);
|
const all = await getSonarrList("user-1", ["watchlist", "completed"]);
|
||||||
expect(all).toHaveLength(2);
|
expect(all).toHaveLength(2);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ describe("logEpisodeWatch", () => {
|
|||||||
expect(row?.status).toBe("completed");
|
expect(row?.status).toBe("completed");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("auto-completes when all episodes are watched", () => {
|
test("stays in_progress when all episodes are watched", () => {
|
||||||
insertUser();
|
insertUser();
|
||||||
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
||||||
|
|
||||||
@@ -248,7 +248,7 @@ describe("logEpisodeWatch", () => {
|
|||||||
.from(userTitleStatus)
|
.from(userTitleStatus)
|
||||||
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
||||||
.get();
|
.get();
|
||||||
expect(row?.status).toBe("completed");
|
expect(row?.status).toBe("in_progress");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -281,7 +281,7 @@ describe("logEpisodeWatchBatch", () => {
|
|||||||
expect(row?.status).toBe("in_progress");
|
expect(row?.status).toBe("in_progress");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("auto-completes if batch covers all episodes", () => {
|
test("stays in_progress if batch covers all episodes", () => {
|
||||||
insertUser();
|
insertUser();
|
||||||
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
||||||
logEpisodeWatchBatch("user-1", episodeIds);
|
logEpisodeWatchBatch("user-1", episodeIds);
|
||||||
@@ -291,7 +291,7 @@ describe("logEpisodeWatchBatch", () => {
|
|||||||
.from(userTitleStatus)
|
.from(userTitleStatus)
|
||||||
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
||||||
.get();
|
.get();
|
||||||
expect(row?.status).toBe("completed");
|
expect(row?.status).toBe("in_progress");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("no-op for empty array", () => {
|
test("no-op for empty array", () => {
|
||||||
@@ -310,7 +310,7 @@ describe("logEpisodeWatchBatch", () => {
|
|||||||
// ── markAllEpisodesWatched ──────────────────────────────────────────
|
// ── markAllEpisodesWatched ──────────────────────────────────────────
|
||||||
|
|
||||||
describe("markAllEpisodesWatched", () => {
|
describe("markAllEpisodesWatched", () => {
|
||||||
test("marks all episodes as watched and sets completed", () => {
|
test("marks all episodes as watched and sets in_progress", () => {
|
||||||
insertUser();
|
insertUser();
|
||||||
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
||||||
markAllEpisodesWatched("user-1", titleId);
|
markAllEpisodesWatched("user-1", titleId);
|
||||||
@@ -327,7 +327,7 @@ describe("markAllEpisodesWatched", () => {
|
|||||||
.from(userTitleStatus)
|
.from(userTitleStatus)
|
||||||
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
||||||
.get();
|
.get();
|
||||||
expect(row?.status).toBe("completed");
|
expect(row?.status).toBe("in_progress");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("skips already-watched episodes (no duplicates)", () => {
|
test("skips already-watched episodes (no duplicates)", () => {
|
||||||
@@ -379,23 +379,15 @@ describe("unwatchEpisode", () => {
|
|||||||
expect(watches).toHaveLength(0);
|
expect(watches).toHaveLength(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("downgrades completed to in_progress", () => {
|
test("keeps in_progress when some episodes remain watched", () => {
|
||||||
insertUser();
|
insertUser();
|
||||||
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
||||||
markAllEpisodesWatched("user-1", titleId);
|
markAllEpisodesWatched("user-1", titleId);
|
||||||
|
|
||||||
// Verify completed first
|
// Unwatch one episode — still has 2 watched
|
||||||
let row = testDb
|
|
||||||
.select()
|
|
||||||
.from(userTitleStatus)
|
|
||||||
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
|
||||||
.get();
|
|
||||||
expect(row?.status).toBe("completed");
|
|
||||||
|
|
||||||
// Unwatch one episode
|
|
||||||
unwatchEpisode("user-1", episodeIds[0]);
|
unwatchEpisode("user-1", episodeIds[0]);
|
||||||
|
|
||||||
row = testDb
|
const row = testDb
|
||||||
.select()
|
.select()
|
||||||
.from(userTitleStatus)
|
.from(userTitleStatus)
|
||||||
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
||||||
@@ -403,7 +395,23 @@ describe("unwatchEpisode", () => {
|
|||||||
expect(row?.status).toBe("in_progress");
|
expect(row?.status).toBe("in_progress");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("doesn't change in_progress status", () => {
|
test("downgrades to watchlist when all episodes unwatched", () => {
|
||||||
|
insertUser();
|
||||||
|
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
||||||
|
|
||||||
|
// Watch one episode then unwatch it
|
||||||
|
logEpisodeWatch("user-1", episodeIds[0]);
|
||||||
|
unwatchEpisode("user-1", episodeIds[0]);
|
||||||
|
|
||||||
|
const row = testDb
|
||||||
|
.select()
|
||||||
|
.from(userTitleStatus)
|
||||||
|
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
||||||
|
.get();
|
||||||
|
expect(row?.status).toBe("watchlist");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("doesn't change in_progress status when episodes remain", () => {
|
||||||
insertUser();
|
insertUser();
|
||||||
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
const { titleId, episodeIds } = insertTvShow("tv-1", 99999, 1, 3);
|
||||||
logEpisodeWatch("user-1", episodeIds[0]);
|
logEpisodeWatch("user-1", episodeIds[0]);
|
||||||
@@ -448,30 +456,40 @@ describe("unwatchSeason", () => {
|
|||||||
expect(watches).toHaveLength(0);
|
expect(watches).toHaveLength(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("downgrades completed to in_progress", () => {
|
test("keeps in_progress when other seasons have watches", () => {
|
||||||
insertUser();
|
insertUser();
|
||||||
const { titleId } = insertTvShow("tv-1", 99999, 2, 2);
|
const { titleId } = insertTvShow("tv-1", 99999, 2, 2);
|
||||||
|
|
||||||
// Watch all episodes across both seasons
|
// Watch all episodes across both seasons
|
||||||
markAllEpisodesWatched("user-1", titleId);
|
markAllEpisodesWatched("user-1", titleId);
|
||||||
|
|
||||||
let row = testDb
|
// Unwatch season 1 — season 2 still has watches
|
||||||
.select()
|
|
||||||
.from(userTitleStatus)
|
|
||||||
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
|
||||||
.get();
|
|
||||||
expect(row?.status).toBe("completed");
|
|
||||||
|
|
||||||
// Unwatch season 1
|
|
||||||
unwatchSeason("user-1", "tv-1-s1");
|
unwatchSeason("user-1", "tv-1-s1");
|
||||||
|
|
||||||
row = testDb
|
const row = testDb
|
||||||
.select()
|
.select()
|
||||||
.from(userTitleStatus)
|
.from(userTitleStatus)
|
||||||
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
||||||
.get();
|
.get();
|
||||||
expect(row?.status).toBe("in_progress");
|
expect(row?.status).toBe("in_progress");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("downgrades to watchlist when all episodes unwatched", () => {
|
||||||
|
insertUser();
|
||||||
|
const { titleId } = insertTvShow("tv-1", 99999, 1, 2);
|
||||||
|
|
||||||
|
markAllEpisodesWatched("user-1", titleId);
|
||||||
|
|
||||||
|
// Unwatch the only season — no episodes remain
|
||||||
|
unwatchSeason("user-1", "tv-1-s1");
|
||||||
|
|
||||||
|
const row = testDb
|
||||||
|
.select()
|
||||||
|
.from(userTitleStatus)
|
||||||
|
.where(and(eq(userTitleStatus.userId, "user-1"), eq(userTitleStatus.titleId, titleId)))
|
||||||
|
.get();
|
||||||
|
expect(row?.status).toBe("watchlist");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// ── rateTitleStars ──────────────────────────────────────────────────
|
// ── rateTitleStars ──────────────────────────────────────────────────
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
-- TV shows should never have 'completed' stored — convert to 'in_progress'.
|
||||||
|
-- Display status (caught_up / completed) is now derived at read time from
|
||||||
|
-- episode progress + TMDB show status.
|
||||||
|
UPDATE userTitleStatus SET status = 'in_progress'
|
||||||
|
WHERE status = 'completed'
|
||||||
|
AND titleId IN (SELECT id FROM titles WHERE type = 'tv');
|
||||||
|
--> statement-breakpoint
|
||||||
|
-- Legacy movie rows stored as 'in_progress' (old UI always sent in_progress
|
||||||
|
-- when clicking Watchlist). Convert to 'watchlist' since no watch was logged.
|
||||||
|
UPDATE userTitleStatus SET status = 'watchlist'
|
||||||
|
WHERE status = 'in_progress'
|
||||||
|
AND titleId IN (SELECT id FROM titles WHERE type = 'movie');
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -74,12 +74,47 @@ export function getUserStatusCounts(userId: string) {
|
|||||||
const [row] = db
|
const [row] = db
|
||||||
.select({
|
.select({
|
||||||
librarySize: sql<number>`count(*)`,
|
librarySize: sql<number>`count(*)`,
|
||||||
completed: sql<number>`sum(case when ${userTitleStatus.status} = 'completed' then 1 else 0 end)`,
|
movieCompleted: sql<number>`sum(case when ${userTitleStatus.status} = 'completed' then 1 else 0 end)`,
|
||||||
})
|
})
|
||||||
.from(userTitleStatus)
|
.from(userTitleStatus)
|
||||||
.where(eq(userTitleStatus.userId, userId))
|
.where(eq(userTitleStatus.userId, userId))
|
||||||
.all();
|
.all();
|
||||||
return row;
|
|
||||||
|
// Count TV shows where all aired episodes are watched (caught_up + completed display states)
|
||||||
|
const today = new Date().toISOString().slice(0, 10);
|
||||||
|
const [tvRow] = db
|
||||||
|
.select({ count: sql<number>`count(*)` })
|
||||||
|
.from(userTitleStatus)
|
||||||
|
.innerJoin(titles, eq(titles.id, userTitleStatus.titleId))
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
eq(userTitleStatus.userId, userId),
|
||||||
|
eq(userTitleStatus.status, "in_progress"),
|
||||||
|
eq(titles.type, "tv"),
|
||||||
|
sql`(
|
||||||
|
SELECT count(distinct e.id) FROM episodes e
|
||||||
|
INNER JOIN seasons s ON e.seasonId = s.id
|
||||||
|
WHERE s.titleId = ${titles.id} AND e.airDate IS NOT NULL AND e.airDate <= ${today}
|
||||||
|
) > 0`,
|
||||||
|
sql`(
|
||||||
|
SELECT count(distinct e.id) FROM episodes e
|
||||||
|
INNER JOIN seasons s ON e.seasonId = s.id
|
||||||
|
WHERE s.titleId = ${titles.id} AND e.airDate IS NOT NULL AND e.airDate <= ${today}
|
||||||
|
) = (
|
||||||
|
SELECT count(distinct ew.episodeId) FROM userEpisodeWatches ew
|
||||||
|
INNER JOIN episodes e2 ON ew.episodeId = e2.id
|
||||||
|
INNER JOIN seasons s2 ON e2.seasonId = s2.id
|
||||||
|
WHERE s2.titleId = ${titles.id} AND ew.userId = ${userTitleStatus.userId}
|
||||||
|
AND e2.airDate IS NOT NULL AND e2.airDate <= ${today}
|
||||||
|
)`,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.all();
|
||||||
|
|
||||||
|
return {
|
||||||
|
librarySize: row?.librarySize ?? 0,
|
||||||
|
completed: (row?.movieCompleted ?? 0) + (tvRow?.count ?? 0),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getInProgressTitleIds(userId: string) {
|
export function getInProgressTitleIds(userId: string) {
|
||||||
@@ -212,11 +247,16 @@ export function getLibraryFeed(userId: string, page = 1, limit = 20) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getCompletedTitleIds(userId: string) {
|
export function getEngagedTitleIds(userId: string) {
|
||||||
return db
|
return db
|
||||||
.select({ titleId: userTitleStatus.titleId })
|
.select({ titleId: userTitleStatus.titleId })
|
||||||
.from(userTitleStatus)
|
.from(userTitleStatus)
|
||||||
.where(and(eq(userTitleStatus.userId, userId), eq(userTitleStatus.status, "completed")))
|
.where(
|
||||||
|
and(
|
||||||
|
eq(userTitleStatus.userId, userId),
|
||||||
|
sql`${userTitleStatus.status} IN ('completed', 'in_progress')`,
|
||||||
|
),
|
||||||
|
)
|
||||||
.all()
|
.all()
|
||||||
.map((r) => r.titleId);
|
.map((r) => r.titleId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,11 +74,10 @@ export function batchInsertEpisodeWatchesTransaction(
|
|||||||
episodeIds: string[],
|
episodeIds: string[],
|
||||||
source: "manual" | "import" | "plex" | "jellyfin" | "emby",
|
source: "manual" | "import" | "plex" | "jellyfin" | "emby",
|
||||||
watchedAt?: Date,
|
watchedAt?: Date,
|
||||||
): { titleId: string | null; completionReached: boolean } {
|
): { titleId: string | null } {
|
||||||
if (episodeIds.length === 0) return { titleId: null, completionReached: false };
|
if (episodeIds.length === 0) return { titleId: null };
|
||||||
|
|
||||||
let resultTitleId: string | null = null;
|
let resultTitleId: string | null = null;
|
||||||
let completionReached = false;
|
|
||||||
|
|
||||||
db.transaction((tx) => {
|
db.transaction((tx) => {
|
||||||
const now = watchedAt ?? new Date();
|
const now = watchedAt ?? new Date();
|
||||||
@@ -119,46 +118,9 @@ export function batchInsertEpisodeWatchesTransaction(
|
|||||||
})
|
})
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
const allSeasons = tx.select().from(seasons).where(eq(seasons.titleId, titleId)).all();
|
|
||||||
if (allSeasons.length === 0) return;
|
|
||||||
|
|
||||||
const allSeasonIds = allSeasons.map((s) => s.id);
|
|
||||||
const allEps = tx.select().from(episodes).where(inArray(episodes.seasonId, allSeasonIds)).all();
|
|
||||||
const totalEpisodes = allEps.length;
|
|
||||||
if (totalEpisodes === 0) return;
|
|
||||||
|
|
||||||
const allEpIds = allEps.map((ep) => ep.id);
|
|
||||||
const [watchCount] = tx
|
|
||||||
.select({
|
|
||||||
count: sql<number>`count(distinct ${userEpisodeWatches.episodeId})`,
|
|
||||||
})
|
|
||||||
.from(userEpisodeWatches)
|
|
||||||
.where(
|
|
||||||
and(eq(userEpisodeWatches.userId, userId), inArray(userEpisodeWatches.episodeId, allEpIds)),
|
|
||||||
)
|
|
||||||
.all();
|
|
||||||
|
|
||||||
if (watchCount.count >= totalEpisodes) {
|
|
||||||
completionReached = true;
|
|
||||||
const completeNow = new Date();
|
|
||||||
tx.insert(userTitleStatus)
|
|
||||||
.values({
|
|
||||||
userId,
|
|
||||||
titleId,
|
|
||||||
status: "completed",
|
|
||||||
addedAt: completeNow,
|
|
||||||
updatedAt: completeNow,
|
|
||||||
})
|
|
||||||
.onConflictDoUpdate({
|
|
||||||
target: [userTitleStatus.userId, userTitleStatus.titleId],
|
|
||||||
set: { status: "completed", updatedAt: completeNow },
|
|
||||||
})
|
|
||||||
.run();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return { titleId: resultTitleId, completionReached };
|
return { titleId: resultTitleId };
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getAllEpisodeIdsForTitle(titleId: string): string[] {
|
export function getAllEpisodeIdsForTitle(titleId: string): string[] {
|
||||||
@@ -253,12 +215,16 @@ export function getUserStatusesByTitleIds(userId: string, titleIds: string[]) {
|
|||||||
|
|
||||||
export function getEpisodeProgressByTitleIds(userId: string, titleIds: string[]) {
|
export function getEpisodeProgressByTitleIds(userId: string, titleIds: string[]) {
|
||||||
if (titleIds.length === 0) return [];
|
if (titleIds.length === 0) return [];
|
||||||
|
const today = new Date().toISOString().slice(0, 10);
|
||||||
return db
|
return db
|
||||||
.select({
|
.select({
|
||||||
titleId: titles.id,
|
titleId: titles.id,
|
||||||
totalEpisodes: sql<number>`count(distinct ${episodes.id})`.as("totalEpisodes"),
|
totalEpisodes:
|
||||||
|
sql<number>`count(distinct case when ${episodes.airDate} IS NOT NULL AND ${episodes.airDate} <= ${today} then ${episodes.id} end)`.as(
|
||||||
|
"totalEpisodes",
|
||||||
|
),
|
||||||
watchedEpisodes:
|
watchedEpisodes:
|
||||||
sql<number>`count(distinct case when ${userEpisodeWatches.id} is not null then ${episodes.id} end)`.as(
|
sql<number>`count(distinct case when ${userEpisodeWatches.id} is not null AND ${episodes.airDate} IS NOT NULL AND ${episodes.airDate} <= ${today} then ${episodes.id} end)`.as(
|
||||||
"watchedEpisodes",
|
"watchedEpisodes",
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -182,9 +182,35 @@ function getUntranslatedEntries(catalog: CatalogType): UntranslatedEntry[] {
|
|||||||
// does not detect argument type changes, malformed plural/select, or nested corruption.
|
// does not detect argument type changes, malformed plural/select, or nested corruption.
|
||||||
|
|
||||||
function extractSimplePlaceholders(text: string): string[] {
|
function extractSimplePlaceholders(text: string): string[] {
|
||||||
// Intentionally conservative. This catches the common placeholder cases:
|
// Extract top-level ICU placeholders ({0}, {name}, {count}) while skipping
|
||||||
// {0}, {name}, {count}
|
// content words nested inside plural/select branches like {episode} in
|
||||||
return [...text.matchAll(/\{[a-zA-Z0-9_]+\}/g)].map((m) => m[0]).sort();
|
// "{count, plural, one {episode} other {episodes}}".
|
||||||
|
const results: string[] = [];
|
||||||
|
let depth = 0;
|
||||||
|
let argStart = -1;
|
||||||
|
|
||||||
|
for (let i = 0; i < text.length; i++) {
|
||||||
|
if (text[i] === "{") {
|
||||||
|
if (depth === 0) argStart = i;
|
||||||
|
depth++;
|
||||||
|
} else if (text[i] === "}") {
|
||||||
|
depth--;
|
||||||
|
if (depth === 0 && argStart >= 0) {
|
||||||
|
const inner = text.slice(argStart + 1, i);
|
||||||
|
// Top-level simple placeholder: just an identifier, no comma (not plural/select)
|
||||||
|
if (/^[a-zA-Z0-9_]+$/.test(inner)) {
|
||||||
|
results.push(`{${inner}}`);
|
||||||
|
} else {
|
||||||
|
// Complex ICU argument — extract just the argument name before the comma
|
||||||
|
const argName = inner.match(/^([a-zA-Z0-9_]+)\s*,/)?.[1];
|
||||||
|
if (argName) results.push(`{${argName}}`);
|
||||||
|
}
|
||||||
|
argStart = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return results.sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
function extractNumberedTags(text: string): string[] {
|
function extractNumberedTags(text: string): string[] {
|
||||||
|
|||||||
+210
-173
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+194
-157
@@ -104,8 +104,8 @@ msgstr ""
|
|||||||
#~ msgid "{0}/{1} episodes"
|
#~ msgid "{0}/{1} episodes"
|
||||||
#~ msgstr "{0}/{1} episodes"
|
#~ msgstr "{0}/{1} episodes"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:200
|
#: apps/web/src/components/titles/use-title-actions.ts:198
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:278
|
#: apps/web/src/components/titles/use-title-actions.ts:270
|
||||||
msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
|
msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -114,22 +114,22 @@ msgstr ""
|
|||||||
msgid "{healthyCount} of {0} jobs healthy"
|
msgid "{healthyCount} of {0} jobs healthy"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:84
|
#: apps/native/src/components/settings/integration-card.tsx:86
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:89
|
#: apps/web/src/components/settings/integration-card.tsx:89
|
||||||
msgid "{label} connected"
|
msgid "{label} connected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:94
|
#: apps/native/src/components/settings/integration-card.tsx:96
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:105
|
#: apps/web/src/components/settings/integration-card.tsx:105
|
||||||
msgid "{label} disconnected"
|
msgid "{label} disconnected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:104
|
#: apps/native/src/components/settings/integration-card.tsx:106
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:119
|
#: apps/web/src/components/settings/integration-card.tsx:119
|
||||||
msgid "{label} URL regenerated"
|
msgid "{label} URL regenerated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/title-card.tsx:152
|
#: apps/web/src/components/title-card.tsx:157
|
||||||
msgid "{watched}/{total} episodes"
|
msgid "{watched}/{total} episodes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -157,7 +157,7 @@ msgstr ""
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:50
|
#: apps/native/src/app/person/[id].tsx:138
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:28
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:28
|
||||||
#: apps/web/src/components/people/person-hero.tsx:69
|
#: apps/web/src/components/people/person-hero.tsx:69
|
||||||
msgid "Actor"
|
msgid "Actor"
|
||||||
@@ -180,13 +180,13 @@ msgstr ""
|
|||||||
msgid "Add to Library"
|
msgid "Add to Library"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:73
|
#: apps/native/src/components/titles/status-action-button.tsx:80
|
||||||
msgid "Add to watchlist"
|
msgid "Add to watchlist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/explore/hero-banner.tsx:132
|
#: apps/native/src/components/explore/hero-banner.tsx:132
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:212
|
#: apps/native/src/components/ui/poster-card.tsx:215
|
||||||
#: apps/web/src/components/title-card.tsx:133
|
#: apps/web/src/components/title-card.tsx:138
|
||||||
msgid "Add to Watchlist"
|
msgid "Add to Watchlist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ msgstr ""
|
|||||||
#: apps/native/src/hooks/use-title-actions.ts:44
|
#: apps/native/src/hooks/use-title-actions.ts:44
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:59
|
#: apps/native/src/hooks/use-title-actions.ts:59
|
||||||
#: apps/native/src/lib/title-actions.ts:25
|
#: apps/native/src/lib/title-actions.ts:25
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:98
|
#: apps/web/src/components/titles/use-title-actions.ts:95
|
||||||
msgid "Added to watchlist"
|
msgid "Added to watchlist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -209,11 +209,11 @@ msgstr ""
|
|||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:154
|
#: apps/web/src/routes/_app/settings.tsx:156
|
||||||
msgid "Admin only"
|
msgid "Admin only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:249
|
#: apps/native/src/app/person/[id].tsx:189
|
||||||
#: apps/web/src/components/people/person-hero.tsx:89
|
#: apps/web/src/components/people/person-hero.tsx:89
|
||||||
msgid "age {age}"
|
msgid "age {age}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -243,7 +243,7 @@ msgstr ""
|
|||||||
msgid "Anonymous usage reporting"
|
msgid "Anonymous usage reporting"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:135
|
#: apps/web/src/routes/_app/settings.tsx:137
|
||||||
msgid "App Settings"
|
msgid "App Settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -251,7 +251,7 @@ msgstr ""
|
|||||||
msgid "Application"
|
msgid "Application"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:139
|
#: apps/native/src/components/settings/integration-card.tsx:148
|
||||||
msgid "Are you sure you want to disconnect {label}? The current URL will stop working."
|
msgid "Are you sure you want to disconnect {label}? The current URL will stop working."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -310,7 +310,7 @@ msgid "Backup schedule"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:583
|
#: apps/web/src/components/settings/system-health-section.tsx:583
|
||||||
#: apps/web/src/routes/_app/settings.tsx:190
|
#: apps/web/src/routes/_app/settings.tsx:192
|
||||||
msgid "Backups"
|
msgid "Backups"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -337,8 +337,9 @@ msgstr ""
|
|||||||
#: apps/native/src/components/header-avatar.tsx:63
|
#: apps/native/src/components/header-avatar.tsx:63
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:58
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:58
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:32
|
#: apps/native/src/components/search/recently-viewed-list.tsx:32
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:126
|
#: apps/native/src/components/settings/integration-card.tsx:135
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:141
|
#: apps/native/src/components/settings/integration-card.tsx:150
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:104
|
||||||
#: apps/web/src/components/settings/account-section.tsx:477
|
#: apps/web/src/components/settings/account-section.tsx:477
|
||||||
#: apps/web/src/components/settings/backup-restore-section.tsx:101
|
#: apps/web/src/components/settings/backup-restore-section.tsx:101
|
||||||
#: apps/web/src/components/settings/backup-section.tsx:240
|
#: apps/web/src/components/settings/backup-section.tsx:240
|
||||||
@@ -348,6 +349,7 @@ msgstr ""
|
|||||||
#: apps/web/src/components/settings/imports-section.tsx:611
|
#: apps/web/src/components/settings/imports-section.tsx:611
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:674
|
#: apps/web/src/components/settings/imports-section.tsx:674
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:798
|
#: apps/web/src/components/settings/imports-section.tsx:798
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:131
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:127
|
#: apps/web/src/components/titles/title-seasons.tsx:127
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -361,14 +363,20 @@ msgstr ""
|
|||||||
msgid "Cast"
|
msgid "Cast"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:202
|
#: apps/web/src/components/titles/use-title-actions.ts:200
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:280
|
#: apps/web/src/components/titles/use-title-actions.ts:272
|
||||||
msgid "Catch up"
|
msgid "Catch up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:50
|
||||||
|
#: apps/web/src/components/title-card.tsx:74
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:54
|
||||||
|
msgid "Caught Up"
|
||||||
|
msgstr "Caught Up"
|
||||||
|
|
||||||
#. placeholder {0}: episodeIds.length
|
#. placeholder {0}: episodeIds.length
|
||||||
#. placeholder {1}: episodeIds.length
|
#. placeholder {1}: episodeIds.length
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:72
|
#: apps/web/src/components/titles/use-title-actions.ts:69
|
||||||
msgid "Caught up — marked {0} {1, plural, one {episode} other {episodes}} as watched"
|
msgid "Caught up — marked {0} {1, plural, one {episode} other {episodes}} as watched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -418,7 +426,7 @@ msgstr ""
|
|||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:60
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:60
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:104
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:104
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:34
|
#: apps/native/src/components/search/recently-viewed-list.tsx:34
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:86
|
#: apps/native/src/components/search/recently-viewed-list.tsx:68
|
||||||
msgid "Clear"
|
msgid "Clear"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -455,10 +463,10 @@ msgid "Close"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:146
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:146
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:45
|
#: apps/native/src/components/titles/status-action-button.tsx:52
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:219
|
#: apps/web/src/components/dashboard/stats-display.tsx:219
|
||||||
#: apps/web/src/components/title-card.tsx:74
|
#: apps/web/src/components/title-card.tsx:79
|
||||||
#: apps/web/src/components/titles/status-button.tsx:25
|
#: apps/web/src/components/titles/status-button.tsx:59
|
||||||
msgid "Completed"
|
msgid "Completed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -477,7 +485,7 @@ msgstr ""
|
|||||||
msgid "Connect {0}"
|
msgid "Connect {0}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:207
|
#: apps/native/src/components/settings/integration-card.tsx:216
|
||||||
msgid "Connect {label}"
|
msgid "Connect {label}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -485,7 +493,7 @@ msgstr ""
|
|||||||
msgid "Connect to {source}"
|
msgid "Connect to {source}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/setup.tsx:98
|
#: apps/web/src/routes/setup.tsx:99
|
||||||
msgid "Connect to TMDB"
|
msgid "Connect to TMDB"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -516,7 +524,7 @@ msgstr ""
|
|||||||
msgid "Connecting..."
|
msgid "Connecting..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:207
|
#: apps/native/src/components/settings/integration-card.tsx:216
|
||||||
msgid "Connecting…"
|
msgid "Connecting…"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -545,7 +553,7 @@ msgstr ""
|
|||||||
msgid "Could not load integrations"
|
msgid "Could not load integrations"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:172
|
#: apps/native/src/app/person/[id].tsx:257
|
||||||
msgid "Could not load person details"
|
msgid "Could not load person details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -579,14 +587,14 @@ msgstr ""
|
|||||||
msgid "Current password is required"
|
msgid "Current password is required"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:216
|
#: apps/web/src/routes/_app/settings.tsx:218
|
||||||
msgid "Danger Zone"
|
msgid "Danger Zone"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/__root.tsx:163
|
#: apps/web/src/routes/__root.tsx:163
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:76
|
#: apps/web/src/routes/_app/people.$id.tsx:78
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:119
|
#: apps/web/src/routes/_app/titles.$id.tsx:120
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:165
|
#: apps/web/src/routes/_app/titles.$id.tsx:166
|
||||||
msgid "Dashboard"
|
msgid "Dashboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -630,12 +638,12 @@ msgstr ""
|
|||||||
msgid "Device code expired. Please try again."
|
msgid "Device code expired. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:249
|
#: apps/native/src/app/person/[id].tsx:189
|
||||||
#: apps/web/src/components/people/person-hero.tsx:89
|
#: apps/web/src/components/people/person-hero.tsx:89
|
||||||
msgid "died at {age}"
|
msgid "died at {age}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:51
|
#: apps/native/src/app/person/[id].tsx:139
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:29
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:29
|
||||||
#: apps/web/src/components/people/person-hero.tsx:71
|
#: apps/web/src/components/people/person-hero.tsx:71
|
||||||
msgid "Director"
|
msgid "Director"
|
||||||
@@ -646,13 +654,13 @@ msgstr ""
|
|||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:143
|
#: apps/native/src/components/settings/integration-card.tsx:152
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:257
|
#: apps/native/src/components/settings/integration-card.tsx:266
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:234
|
#: apps/web/src/components/settings/integration-card.tsx:234
|
||||||
msgid "Disconnect"
|
msgid "Disconnect"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:138
|
#: apps/native/src/components/settings/integration-card.tsx:147
|
||||||
msgid "Disconnect {label}"
|
msgid "Disconnect {label}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -685,7 +693,7 @@ msgstr ""
|
|||||||
msgid "Download backup"
|
msgid "Download backup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:54
|
#: apps/native/src/app/person/[id].tsx:142
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:32
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:32
|
||||||
#: apps/web/src/components/people/person-hero.tsx:77
|
#: apps/web/src/components/people/person-hero.tsx:77
|
||||||
msgid "Editor"
|
msgid "Editor"
|
||||||
@@ -729,24 +737,31 @@ msgstr ""
|
|||||||
msgid "Environment"
|
msgid "Environment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. placeholder {0}: episode.episodeNumber
|
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:27
|
#: apps/native/src/components/titles/episode-row.tsx:27
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:48
|
#: apps/native/src/components/titles/episode-row.tsx:48
|
||||||
msgid "Episode {0}"
|
#~ msgid "Episode {0}"
|
||||||
msgstr ""
|
#~ msgstr ""
|
||||||
|
|
||||||
#. placeholder {0}: episode.episodeNumber
|
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:34
|
#: apps/native/src/components/titles/episode-row.tsx:34
|
||||||
msgid "Episode {0}, {episodeLabel}"
|
#~ msgid "Episode {0}, {episodeLabel}"
|
||||||
msgstr ""
|
#~ msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:111
|
#: apps/native/src/components/titles/episode-row.tsx:29
|
||||||
#: apps/native/src/lib/title-actions.ts:108
|
#: apps/native/src/components/titles/episode-row.tsx:52
|
||||||
|
msgid "Episode {episodeNumber}"
|
||||||
|
msgstr "Episode {episodeNumber}"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/episode-row.tsx:38
|
||||||
|
msgid "Episode {episodeNumber}, {episodeLabel}"
|
||||||
|
msgstr "Episode {episodeNumber}, {episodeLabel}"
|
||||||
|
|
||||||
|
#: apps/native/src/hooks/use-title-actions.ts:109
|
||||||
|
#: apps/native/src/lib/title-actions.ts:84
|
||||||
msgid "Episode unwatched"
|
msgid "Episode unwatched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:101
|
#: apps/native/src/hooks/use-title-actions.ts:99
|
||||||
#: apps/native/src/lib/title-actions.ts:98
|
#: apps/native/src/lib/title-actions.ts:74
|
||||||
msgid "Episode watched"
|
msgid "Episode watched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -790,8 +805,8 @@ msgstr ""
|
|||||||
msgid "Explore"
|
msgid "Explore"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:68
|
#: apps/web/src/routes/_app/people.$id.tsx:70
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:157
|
#: apps/web/src/routes/_app/titles.$id.tsx:158
|
||||||
msgid "Explore titles"
|
msgid "Explore titles"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -804,7 +819,7 @@ msgstr ""
|
|||||||
msgid "Failed to add to watchlist"
|
msgid "Failed to add to watchlist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:80
|
#: apps/web/src/components/titles/use-title-actions.ts:77
|
||||||
msgid "Failed to catch up"
|
msgid "Failed to catch up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -817,7 +832,7 @@ msgstr ""
|
|||||||
msgid "Failed to connect"
|
msgid "Failed to connect"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:87
|
#: apps/native/src/components/settings/integration-card.tsx:89
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:91
|
#: apps/web/src/components/settings/integration-card.tsx:91
|
||||||
msgid "Failed to connect {label}"
|
msgid "Failed to connect {label}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -834,7 +849,7 @@ msgstr ""
|
|||||||
msgid "Failed to delete backup"
|
msgid "Failed to delete backup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:97
|
#: apps/native/src/components/settings/integration-card.tsx:99
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:108
|
#: apps/web/src/components/settings/integration-card.tsx:108
|
||||||
msgid "Failed to disconnect {label}"
|
msgid "Failed to disconnect {label}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -843,29 +858,30 @@ msgstr ""
|
|||||||
msgid "Failed to load backup schedule settings."
|
msgid "Failed to load backup schedule settings."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:110
|
#: apps/web/src/routes/_app/titles.$id.tsx:111
|
||||||
msgid "Failed to load title"
|
msgid "Failed to load title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:344
|
#: apps/native/src/lib/title-actions.ts:101
|
||||||
|
#: apps/web/src/components/titles/use-title-actions.ts:338
|
||||||
msgid "Failed to mark all episodes as watched"
|
msgid "Failed to mark all episodes as watched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:79
|
#: apps/native/src/hooks/use-title-actions.ts:77
|
||||||
#: apps/native/src/lib/title-actions.ts:67
|
#: apps/native/src/lib/title-actions.ts:43
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:137
|
#: apps/web/src/components/titles/use-title-actions.ts:134
|
||||||
msgid "Failed to mark as watched"
|
msgid "Failed to mark as watched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:104
|
#: apps/native/src/hooks/use-title-actions.ts:102
|
||||||
#: apps/native/src/lib/title-actions.ts:101
|
#: apps/native/src/lib/title-actions.ts:77
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:216
|
#: apps/web/src/components/titles/use-title-actions.ts:214
|
||||||
msgid "Failed to mark episode"
|
msgid "Failed to mark episode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:124
|
#: apps/native/src/hooks/use-title-actions.ts:122
|
||||||
#: apps/native/src/lib/title-actions.ts:123
|
#: apps/native/src/lib/title-actions.ts:113
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:294
|
#: apps/web/src/components/titles/use-title-actions.ts:286
|
||||||
msgid "Failed to mark some episodes"
|
msgid "Failed to mark some episodes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -889,12 +905,12 @@ msgstr ""
|
|||||||
msgid "Failed to purge metadata cache"
|
msgid "Failed to purge metadata cache"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:107
|
#: apps/native/src/components/settings/integration-card.tsx:109
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:121
|
#: apps/web/src/components/settings/integration-card.tsx:121
|
||||||
msgid "Failed to regenerate {label} URL"
|
msgid "Failed to regenerate {label} URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:77
|
#: apps/native/src/lib/title-actions.ts:53
|
||||||
msgid "Failed to remove from library"
|
msgid "Failed to remove from library"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -916,13 +932,13 @@ msgstr ""
|
|||||||
msgid "Failed to trigger job"
|
msgid "Failed to trigger job"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:114
|
#: apps/native/src/hooks/use-title-actions.ts:112
|
||||||
#: apps/native/src/lib/title-actions.ts:111
|
#: apps/native/src/lib/title-actions.ts:87
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:163
|
#: apps/web/src/components/titles/use-title-actions.ts:161
|
||||||
msgid "Failed to unmark episode"
|
msgid "Failed to unmark episode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:320
|
#: apps/web/src/components/titles/use-title-actions.ts:312
|
||||||
msgid "Failed to unmark some episodes"
|
msgid "Failed to unmark some episodes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -930,9 +946,9 @@ msgstr ""
|
|||||||
msgid "Failed to update name"
|
msgid "Failed to update name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:94
|
#: apps/native/src/hooks/use-title-actions.ts:92
|
||||||
#: apps/native/src/lib/title-actions.ts:91
|
#: apps/native/src/lib/title-actions.ts:67
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:123
|
#: apps/web/src/components/titles/use-title-actions.ts:120
|
||||||
msgid "Failed to update rating"
|
msgid "Failed to update rating"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -958,10 +974,8 @@ msgstr ""
|
|||||||
msgid "Failed to update setting"
|
msgid "Failed to update setting"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:69
|
#: apps/native/src/hooks/use-title-actions.ts:67
|
||||||
#: apps/native/src/lib/title-actions.ts:41
|
#: apps/web/src/components/titles/use-title-actions.ts:98
|
||||||
#: apps/native/src/lib/title-actions.ts:55
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:101
|
|
||||||
msgid "Failed to update status"
|
msgid "Failed to update status"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -973,7 +987,7 @@ msgstr ""
|
|||||||
msgid "Fetching your library data from {source}..."
|
msgid "Fetching your library data from {source}..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:279
|
#: apps/native/src/app/person/[id].tsx:219
|
||||||
#: apps/web/src/components/people/filmography-grid.tsx:67
|
#: apps/web/src/components/people/filmography-grid.tsx:67
|
||||||
msgid "Filmography"
|
msgid "Filmography"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1002,8 +1016,8 @@ msgstr ""
|
|||||||
msgid "Get Started"
|
msgid "Get Started"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:176
|
#: apps/native/src/app/person/[id].tsx:261
|
||||||
#: apps/native/src/app/person/[id].tsx:196
|
#: apps/native/src/app/person/[id].tsx:281
|
||||||
#: apps/native/src/app/title/[id].tsx:235
|
#: apps/native/src/app/title/[id].tsx:235
|
||||||
msgid "Go back"
|
msgid "Go back"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1112,6 +1126,11 @@ msgstr ""
|
|||||||
msgid "In Library"
|
msgid "In Library"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:46
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:40
|
||||||
|
msgid "In Watchlist"
|
||||||
|
msgstr "In Watchlist"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:179
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:179
|
||||||
#: apps/web/src/components/dashboard/library-section.tsx:35
|
#: apps/web/src/components/dashboard/library-section.tsx:35
|
||||||
msgid "In Your Library"
|
msgid "In Your Library"
|
||||||
@@ -1222,22 +1241,23 @@ msgid "Mark all episodes as watched?"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:152
|
#: apps/native/src/components/titles/season-accordion.tsx:152
|
||||||
|
#: apps/native/src/components/ui/poster-card.tsx:229
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:109
|
#: apps/web/src/components/titles/title-seasons.tsx:109
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:135
|
#: apps/web/src/components/titles/title-seasons.tsx:135
|
||||||
msgid "Mark All Watched"
|
msgid "Mark All Watched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/continue-watching-card.tsx:103
|
#: apps/native/src/components/dashboard/continue-watching-card.tsx:103
|
||||||
msgid "Mark as Completed"
|
#~ msgid "Mark as Completed"
|
||||||
msgstr ""
|
#~ msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:226
|
#: apps/native/src/components/ui/poster-card.tsx:222
|
||||||
msgid "Mark as Watched"
|
msgid "Mark as Watched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:219
|
#: apps/native/src/components/ui/poster-card.tsx:219
|
||||||
msgid "Mark as Watching"
|
#~ msgid "Mark as Watching"
|
||||||
msgstr ""
|
#~ msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/title/[id].tsx:400
|
#: apps/native/src/app/title/[id].tsx:400
|
||||||
#: apps/web/src/components/titles/title-actions.tsx:27
|
#: apps/web/src/components/titles/title-actions.tsx:27
|
||||||
@@ -1245,32 +1265,37 @@ msgid "Mark Watched"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:50
|
#: apps/native/src/lib/title-actions.ts:50
|
||||||
msgid "Marked \"{titleName}\" as completed"
|
#~ msgid "Marked \"{titleName}\" as completed"
|
||||||
msgstr ""
|
#~ msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:63
|
#: apps/native/src/lib/title-actions.ts:39
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:134
|
#: apps/web/src/components/titles/use-title-actions.ts:131
|
||||||
msgid "Marked \"{titleName}\" as watched"
|
msgid "Marked \"{titleName}\" as watched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:337
|
#: apps/native/src/lib/title-actions.ts:97
|
||||||
|
#: apps/web/src/components/titles/use-title-actions.ts:331
|
||||||
msgid "Marked all episodes as watched"
|
msgid "Marked all episodes as watched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: apps/native/src/lib/title-actions.ts:96
|
||||||
|
msgid "Marked all episodes of \"{titleName}\" as watched"
|
||||||
|
msgstr "Marked all episodes of \"{titleName}\" as watched"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:61
|
#: apps/native/src/hooks/use-title-actions.ts:61
|
||||||
#: apps/native/src/lib/title-actions.ts:51
|
#: apps/native/src/lib/title-actions.ts:51
|
||||||
msgid "Marked as completed"
|
#~ msgid "Marked as completed"
|
||||||
msgstr ""
|
#~ msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:76
|
#: apps/native/src/hooks/use-title-actions.ts:74
|
||||||
#: apps/native/src/lib/title-actions.ts:63
|
#: apps/native/src/lib/title-actions.ts:39
|
||||||
msgid "Marked as watched"
|
msgid "Marked as watched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:60
|
#: apps/native/src/hooks/use-title-actions.ts:60
|
||||||
#: apps/native/src/lib/title-actions.ts:38
|
#: apps/native/src/lib/title-actions.ts:38
|
||||||
msgid "Marked as watching"
|
#~ msgid "Marked as watching"
|
||||||
msgstr ""
|
#~ msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/settings/account-section.tsx:314
|
#: apps/web/src/components/settings/account-section.tsx:314
|
||||||
msgid "Member since {memberSince}"
|
msgid "Member since {memberSince}"
|
||||||
@@ -1345,7 +1370,7 @@ msgstr ""
|
|||||||
msgid "New account creation is currently disabled."
|
msgid "New account creation is currently disabled."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_auth/register.tsx:36
|
#: apps/web/src/routes/_auth/register.tsx:33
|
||||||
msgid "New accounts are not being accepted right now. Contact the admin if you need access."
|
msgid "New accounts are not being accepted right now. Contact the admin if you need access."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1403,7 +1428,7 @@ msgstr ""
|
|||||||
msgid "No titles found for this genre."
|
msgid "No titles found for this genre."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:174
|
#: apps/native/src/components/settings/integration-card.tsx:183
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:153
|
#: apps/web/src/components/settings/integration-card.tsx:153
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:229
|
#: apps/web/src/components/settings/system-health-section.tsx:229
|
||||||
msgid "Not configured"
|
msgid "Not configured"
|
||||||
@@ -1517,8 +1542,8 @@ msgstr ""
|
|||||||
msgid "Person"
|
msgid "Person"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:192
|
#: apps/native/src/app/person/[id].tsx:277
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:50
|
#: apps/web/src/routes/_app/people.$id.tsx:52
|
||||||
msgid "Person not found"
|
msgid "Person not found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1527,12 +1552,12 @@ msgid "Play trailer"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:89
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:89
|
||||||
#: apps/web/src/routes/_app/explore.tsx:141
|
#: apps/web/src/routes/_app/explore.tsx:143
|
||||||
msgid "Popular Movies"
|
msgid "Popular Movies"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:102
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:102
|
||||||
#: apps/web/src/routes/_app/explore.tsx:151
|
#: apps/web/src/routes/_app/explore.tsx:153
|
||||||
msgid "Popular TV Shows"
|
msgid "Popular TV Shows"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1540,7 +1565,7 @@ msgstr ""
|
|||||||
msgid "Pre-restore backup"
|
msgid "Pre-restore backup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:53
|
#: apps/native/src/app/person/[id].tsx:141
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:31
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:31
|
||||||
#: apps/web/src/components/people/person-hero.tsx:75
|
#: apps/web/src/components/people/person-hero.tsx:75
|
||||||
msgid "Producer"
|
msgid "Producer"
|
||||||
@@ -1612,7 +1637,7 @@ msgstr ""
|
|||||||
|
|
||||||
#. placeholder {0}: input.stars
|
#. placeholder {0}: input.stars
|
||||||
#. placeholder {1}: input.stars
|
#. placeholder {1}: input.stars
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:88
|
#: apps/native/src/hooks/use-title-actions.ts:86
|
||||||
msgid "Rated {0} {1, plural, one {star} other {stars}}"
|
msgid "Rated {0} {1, plural, one {star} other {stars}}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1620,11 +1645,11 @@ msgstr ""
|
|||||||
#~ msgid "Rated {0} star{1}"
|
#~ msgid "Rated {0} star{1}"
|
||||||
#~ msgstr "Rated {0} star{1}"
|
#~ msgstr "Rated {0} star{1}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:118
|
#: apps/web/src/components/titles/use-title-actions.ts:115
|
||||||
msgid "Rated {ratingStars} {ratingStars, plural, one {star} other {stars}}"
|
msgid "Rated {ratingStars} {ratingStars, plural, one {star} other {stars}}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:86
|
#: apps/native/src/lib/title-actions.ts:62
|
||||||
msgid "Rated {stars, plural, one {# star} other {# stars}}"
|
msgid "Rated {stars, plural, one {# star} other {# stars}}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1633,9 +1658,9 @@ msgstr ""
|
|||||||
msgid "Rating"
|
msgid "Rating"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:89
|
#: apps/native/src/hooks/use-title-actions.ts:87
|
||||||
#: apps/native/src/lib/title-actions.ts:87
|
#: apps/native/src/lib/title-actions.ts:63
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:119
|
#: apps/web/src/components/titles/use-title-actions.ts:116
|
||||||
msgid "Rating removed"
|
msgid "Rating removed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1663,7 +1688,7 @@ msgid "Recent Searches"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:95
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:95
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:77
|
#: apps/native/src/components/search/recently-viewed-list.tsx:59
|
||||||
msgid "Recently Viewed"
|
msgid "Recently Viewed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1692,12 +1717,12 @@ msgstr ""
|
|||||||
msgid "Refresh system health"
|
msgid "Refresh system health"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:128
|
#: apps/native/src/components/settings/integration-card.tsx:137
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:248
|
#: apps/native/src/components/settings/integration-card.tsx:257
|
||||||
msgid "Regenerate"
|
msgid "Regenerate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:123
|
#: apps/native/src/components/settings/integration-card.tsx:132
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:226
|
#: apps/web/src/components/settings/integration-card.tsx:226
|
||||||
msgid "Regenerate URL"
|
msgid "Regenerate URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1717,7 +1742,7 @@ msgid "Registration closed"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/(auth)/register.tsx:87
|
#: apps/native/src/app/(auth)/register.tsx:87
|
||||||
#: apps/web/src/routes/_auth/register.tsx:33
|
#: apps/web/src/routes/_auth/register.tsx:30
|
||||||
msgid "Registration Closed"
|
msgid "Registration Closed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1726,20 +1751,27 @@ msgstr ""
|
|||||||
msgid "Registration opened"
|
msgid "Registration opened"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/titles/status-button.tsx:76
|
#: apps/native/src/components/titles/status-action-button.tsx:106
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:109
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:139
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:96
|
#: apps/native/src/components/titles/status-action-button.tsx:115
|
||||||
#: apps/web/src/components/titles/status-button.tsx:60
|
#: apps/web/src/components/titles/status-button.tsx:93
|
||||||
msgid "Remove from library"
|
msgid "Remove from library"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/continue-watching-card.tsx:108
|
#: apps/native/src/components/dashboard/continue-watching-card.tsx:108
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:233
|
#: apps/native/src/components/ui/poster-card.tsx:236
|
||||||
msgid "Remove from Library"
|
msgid "Remove from Library"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:101
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:120
|
||||||
|
msgid "Remove from library?"
|
||||||
|
msgstr "Remove from library?"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:268
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:268
|
||||||
msgid "Remove Photo"
|
msgid "Remove Photo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1752,9 +1784,9 @@ msgstr ""
|
|||||||
msgid "Remove profile picture"
|
msgid "Remove profile picture"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:65
|
#: apps/native/src/hooks/use-title-actions.ts:63
|
||||||
#: apps/native/src/lib/title-actions.ts:74
|
#: apps/native/src/lib/title-actions.ts:50
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:98
|
#: apps/web/src/components/titles/use-title-actions.ts:95
|
||||||
msgid "Removed from library"
|
msgid "Removed from library"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1868,7 +1900,7 @@ msgid "Search for movies and TV shows to start tracking"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:72
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:72
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:55
|
#: apps/native/src/components/search/recently-viewed-list.tsx:81
|
||||||
msgid "Search for movies, shows, or people"
|
msgid "Search for movies, shows, or people"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1892,13 +1924,13 @@ msgstr ""
|
|||||||
#. placeholder {0}: season.seasonNumber
|
#. placeholder {0}: season.seasonNumber
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:113
|
#: apps/native/src/components/titles/season-accordion.tsx:113
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:119
|
#: apps/native/src/components/titles/season-accordion.tsx:119
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:274
|
#: apps/web/src/components/titles/use-title-actions.ts:266
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:313
|
#: apps/web/src/components/titles/use-title-actions.ts:305
|
||||||
msgid "Season {0}"
|
msgid "Season {0}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:121
|
#: apps/native/src/hooks/use-title-actions.ts:119
|
||||||
#: apps/native/src/lib/title-actions.ts:119
|
#: apps/native/src/lib/title-actions.ts:109
|
||||||
msgid "Season watched"
|
msgid "Season watched"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1907,7 +1939,7 @@ msgid "Seasons"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:452
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:452
|
||||||
#: apps/web/src/routes/_app/settings.tsx:167
|
#: apps/web/src/routes/_app/settings.tsx:169
|
||||||
msgid "Security"
|
msgid "Security"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1915,7 +1947,7 @@ msgstr ""
|
|||||||
msgid "Self-hosted movie & TV tracker"
|
msgid "Self-hosted movie & TV tracker"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:151
|
#: apps/web/src/routes/_app/settings.tsx:153
|
||||||
msgid "Server"
|
msgid "Server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1947,12 +1979,12 @@ msgstr ""
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:271
|
#: apps/native/src/components/settings/integration-card.tsx:280
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:248
|
#: apps/web/src/components/settings/integration-card.tsx:248
|
||||||
msgid "Setup instructions"
|
msgid "Setup instructions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/setup.tsx:95
|
#: apps/web/src/routes/setup.tsx:96
|
||||||
msgid "Setup required"
|
msgid "Setup required"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1977,7 +2009,7 @@ msgstr ""
|
|||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_auth/register.tsx:45
|
#: apps/web/src/routes/_auth/register.tsx:42
|
||||||
msgid "Sign in instead"
|
msgid "Sign in instead"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2031,13 +2063,13 @@ msgid "Sofa will automatically log movies and episodes when you finish watching
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/change-password.tsx:77
|
#: apps/native/src/app/change-password.tsx:77
|
||||||
#: apps/native/src/app/person/[id].tsx:169
|
#: apps/native/src/app/person/[id].tsx:254
|
||||||
#: apps/web/src/components/settings/account-section.tsx:391
|
#: apps/web/src/components/settings/account-section.tsx:391
|
||||||
#: apps/web/src/routes/__root.tsx:139
|
#: apps/web/src/routes/__root.tsx:139
|
||||||
msgid "Something went wrong"
|
msgid "Something went wrong"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:113
|
#: apps/web/src/routes/_app/titles.$id.tsx:114
|
||||||
msgid "Something went wrong while loading this title. Please try again."
|
msgid "Something went wrong while loading this title. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2070,7 +2102,7 @@ msgstr ""
|
|||||||
msgid "Starting import..."
|
msgid "Starting import..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:64
|
#: apps/native/src/hooks/use-title-actions.ts:62
|
||||||
msgid "Status updated"
|
msgid "Status updated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2095,11 +2127,11 @@ msgstr ""
|
|||||||
msgid "The page you're looking for doesn't exist."
|
msgid "The page you're looking for doesn't exist."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:53
|
#: apps/web/src/routes/_app/people.$id.tsx:55
|
||||||
msgid "The person you're looking for doesn't exist or may have been removed from the database."
|
msgid "The person you're looking for doesn't exist or may have been removed from the database."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:142
|
#: apps/web/src/routes/_app/titles.$id.tsx:143
|
||||||
msgid "The title you're looking for doesn't exist or may have been removed from the database."
|
msgid "The title you're looking for doesn't exist or may have been removed from the database."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2121,11 +2153,16 @@ msgid "This page was left on the cutting room floor. It may have been moved, rem
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:559
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:559
|
||||||
#: apps/web/src/routes/_app/settings.tsx:112
|
#: apps/web/src/routes/_app/settings.tsx:114
|
||||||
#: apps/web/src/routes/setup.tsx:180
|
#: apps/web/src/routes/setup.tsx:181
|
||||||
msgid "This product uses the TMDB API but is not endorsed or certified by TMDB."
|
msgid "This product uses the TMDB API but is not endorsed or certified by TMDB."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:102
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:123
|
||||||
|
msgid "This title will be removed from your library. Your watch history and ratings will be kept."
|
||||||
|
msgstr "This title will be removed from your library. Your watch history and ratings will be kept."
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:88
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:88
|
||||||
msgid "this week"
|
msgid "this week"
|
||||||
msgstr "this week"
|
msgstr "this week"
|
||||||
@@ -2147,7 +2184,7 @@ msgstr ""
|
|||||||
msgid "This will delete un-enriched stub titles that aren't in any user's library and clean up orphaned person records. Deleted titles will be re-imported if accessed again."
|
msgid "This will delete un-enriched stub titles that aren't in any user's library and clean up orphaned person records. Deleted titles will be re-imported if accessed again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:124
|
#: apps/native/src/components/settings/integration-card.tsx:133
|
||||||
msgid "This will invalidate the current {label} URL. You'll need to update it in {label}."
|
msgid "This will invalidate the current {label} URL. You'll need to update it in {label}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2187,7 +2224,7 @@ msgid "Time:"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/title/[id].tsx:231
|
#: apps/native/src/app/title/[id].tsx:231
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:139
|
#: apps/web/src/routes/_app/titles.$id.tsx:140
|
||||||
msgid "Title not found"
|
msgid "Title not found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2236,7 +2273,7 @@ msgid "Trending today"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:77
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:77
|
||||||
#: apps/web/src/routes/_app/explore.tsx:129
|
#: apps/web/src/routes/_app/explore.tsx:131
|
||||||
msgid "Trending Today"
|
msgid "Trending Today"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2291,11 +2328,11 @@ msgid "Unwatch all"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. placeholder {0}: season.name ?? t`Season ${season.seasonNumber}`
|
#. placeholder {0}: season.name ?? t`Season ${season.seasonNumber}`
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:313
|
#: apps/web/src/components/titles/use-title-actions.ts:305
|
||||||
msgid "Unwatched all of {0}"
|
msgid "Unwatched all of {0}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:156
|
#: apps/web/src/components/titles/use-title-actions.ts:154
|
||||||
msgid "Unwatched S{seasonNum} E{epNum}"
|
msgid "Unwatched S{seasonNum} E{epNum}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2366,7 +2403,7 @@ msgstr ""
|
|||||||
msgid "Upload profile picture"
|
msgid "Upload profile picture"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:117
|
#: apps/native/src/components/settings/integration-card.tsx:125
|
||||||
msgid "URL copied to clipboard"
|
msgid "URL copied to clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2399,36 +2436,36 @@ msgstr ""
|
|||||||
msgid "Watch on {name}"
|
msgid "Watch on {name}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:277
|
#: apps/web/src/components/titles/use-title-actions.ts:269
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:286
|
#: apps/web/src/components/titles/use-title-actions.ts:278
|
||||||
msgid "Watched all of {seasonLabel}"
|
msgid "Watched all of {seasonLabel}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:119
|
#: apps/native/src/lib/title-actions.ts:109
|
||||||
msgid "Watched all of {seasonName}"
|
msgid "Watched all of {seasonName}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:199
|
#: apps/web/src/components/titles/use-title-actions.ts:197
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:208
|
#: apps/web/src/components/titles/use-title-actions.ts:206
|
||||||
msgid "Watched S{seasonNum} E{epNum}"
|
msgid "Watched S{seasonNum} E{epNum}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:43
|
#: apps/native/src/components/titles/status-action-button.tsx:48
|
||||||
#: apps/web/src/components/title-card.tsx:69
|
#: apps/web/src/components/title-card.tsx:69
|
||||||
#: apps/web/src/components/titles/status-button.tsx:14
|
#: apps/web/src/components/titles/status-button.tsx:47
|
||||||
msgid "Watching"
|
msgid "Watching"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:78
|
#: apps/native/src/components/titles/status-action-button.tsx:85
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:743
|
#: apps/web/src/components/settings/imports-section.tsx:743
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:769
|
#: apps/web/src/components/settings/imports-section.tsx:769
|
||||||
#: apps/web/src/components/titles/status-button.tsx:49
|
#: apps/web/src/components/titles/status-button.tsx:82
|
||||||
msgid "Watchlist"
|
msgid "Watchlist"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:41
|
#: apps/native/src/components/titles/status-action-button.tsx:41
|
||||||
msgid "Watchlisted"
|
#~ msgid "Watchlisted"
|
||||||
msgstr ""
|
#~ msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-configs.ts:51
|
#: apps/native/src/components/settings/integration-configs.ts:51
|
||||||
#: apps/native/src/components/settings/integration-configs.ts:66
|
#: apps/native/src/components/settings/integration-configs.ts:66
|
||||||
@@ -2458,7 +2495,7 @@ msgstr ""
|
|||||||
msgid "With Ads"
|
msgid "With Ads"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:52
|
#: apps/native/src/app/person/[id].tsx:140
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:30
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:30
|
||||||
#: apps/web/src/components/people/person-hero.tsx:73
|
#: apps/web/src/components/people/person-hero.tsx:73
|
||||||
msgid "Writer"
|
msgid "Writer"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
+207
-170
@@ -57,7 +57,7 @@ msgstr "{0} imágenes en caché"
|
|||||||
#. placeholder {1}: member.episodeCount !== 1 ? "s" : ""
|
#. placeholder {1}: member.episodeCount !== 1 ? "s" : ""
|
||||||
#: apps/web/src/components/titles/cast-carousel.tsx:78
|
#: apps/web/src/components/titles/cast-carousel.tsx:78
|
||||||
msgid "{0} ep{1}"
|
msgid "{0} ep{1}"
|
||||||
msgstr ""
|
msgstr "{0} ep{1}"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:472
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:472
|
||||||
#~ msgid "{0} images"
|
#~ msgid "{0} images"
|
||||||
@@ -104,8 +104,8 @@ msgstr "{0}/{1} {2, plural, one {episodio} other {episodios}}"
|
|||||||
#~ msgid "{0}/{1} episodes"
|
#~ msgid "{0}/{1} episodes"
|
||||||
#~ msgstr "{0}/{1} episodes"
|
#~ msgstr "{0}/{1} episodes"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:200
|
#: apps/web/src/components/titles/use-title-actions.ts:198
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:278
|
#: apps/web/src/components/titles/use-title-actions.ts:270
|
||||||
msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
|
msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
|
||||||
msgstr "{count} {count, plural, one {episodio anterior sin ver} other {episodios anteriores sin ver}}"
|
msgstr "{count} {count, plural, one {episodio anterior sin ver} other {episodios anteriores sin ver}}"
|
||||||
|
|
||||||
@@ -114,22 +114,22 @@ msgstr "{count} {count, plural, one {episodio anterior sin ver} other {episodios
|
|||||||
msgid "{healthyCount} of {0} jobs healthy"
|
msgid "{healthyCount} of {0} jobs healthy"
|
||||||
msgstr "{healthyCount} de {0} tareas en buen estado"
|
msgstr "{healthyCount} de {0} tareas en buen estado"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:84
|
#: apps/native/src/components/settings/integration-card.tsx:86
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:89
|
#: apps/web/src/components/settings/integration-card.tsx:89
|
||||||
msgid "{label} connected"
|
msgid "{label} connected"
|
||||||
msgstr "{label} conectado"
|
msgstr "{label} conectado"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:94
|
#: apps/native/src/components/settings/integration-card.tsx:96
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:105
|
#: apps/web/src/components/settings/integration-card.tsx:105
|
||||||
msgid "{label} disconnected"
|
msgid "{label} disconnected"
|
||||||
msgstr "{label} desconectado"
|
msgstr "{label} desconectado"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:104
|
#: apps/native/src/components/settings/integration-card.tsx:106
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:119
|
#: apps/web/src/components/settings/integration-card.tsx:119
|
||||||
msgid "{label} URL regenerated"
|
msgid "{label} URL regenerated"
|
||||||
msgstr "URL de {label} regenerada"
|
msgstr "URL de {label} regenerada"
|
||||||
|
|
||||||
#: apps/web/src/components/title-card.tsx:152
|
#: apps/web/src/components/title-card.tsx:157
|
||||||
msgid "{watched}/{total} episodes"
|
msgid "{watched}/{total} episodes"
|
||||||
msgstr "{watched}/{total} episodios"
|
msgstr "{watched}/{total} episodios"
|
||||||
|
|
||||||
@@ -157,11 +157,11 @@ msgstr "Cuenta"
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Acciones"
|
msgstr "Acciones"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:50
|
#: apps/native/src/app/person/[id].tsx:138
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:28
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:28
|
||||||
#: apps/web/src/components/people/person-hero.tsx:69
|
#: apps/web/src/components/people/person-hero.tsx:69
|
||||||
msgid "Actor"
|
msgid "Actor"
|
||||||
msgstr ""
|
msgstr "Actor"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-configs.ts:71
|
#: apps/native/src/components/settings/integration-configs.ts:71
|
||||||
msgid "Add a \"Generic Destination\" and paste the URL above"
|
msgid "Add a \"Generic Destination\" and paste the URL above"
|
||||||
@@ -180,13 +180,13 @@ msgstr "Añade un nuevo webhook y pega la URL anterior"
|
|||||||
msgid "Add to Library"
|
msgid "Add to Library"
|
||||||
msgstr "Añadir a la biblioteca"
|
msgstr "Añadir a la biblioteca"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:73
|
#: apps/native/src/components/titles/status-action-button.tsx:80
|
||||||
msgid "Add to watchlist"
|
msgid "Add to watchlist"
|
||||||
msgstr "Añadir a la lista"
|
msgstr "Añadir a la lista"
|
||||||
|
|
||||||
#: apps/native/src/components/explore/hero-banner.tsx:132
|
#: apps/native/src/components/explore/hero-banner.tsx:132
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:212
|
#: apps/native/src/components/ui/poster-card.tsx:215
|
||||||
#: apps/web/src/components/title-card.tsx:133
|
#: apps/web/src/components/title-card.tsx:138
|
||||||
msgid "Add to Watchlist"
|
msgid "Add to Watchlist"
|
||||||
msgstr "Añadir a la lista"
|
msgstr "Añadir a la lista"
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ msgstr "\"{titleName}\" añadido a la lista"
|
|||||||
#: apps/native/src/hooks/use-title-actions.ts:44
|
#: apps/native/src/hooks/use-title-actions.ts:44
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:59
|
#: apps/native/src/hooks/use-title-actions.ts:59
|
||||||
#: apps/native/src/lib/title-actions.ts:25
|
#: apps/native/src/lib/title-actions.ts:25
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:98
|
#: apps/web/src/components/titles/use-title-actions.ts:95
|
||||||
msgid "Added to watchlist"
|
msgid "Added to watchlist"
|
||||||
msgstr "Añadido a la lista"
|
msgstr "Añadido a la lista"
|
||||||
|
|
||||||
@@ -207,13 +207,13 @@ msgstr "Añadido a la lista"
|
|||||||
#: apps/web/src/components/nav-bar.tsx:223
|
#: apps/web/src/components/nav-bar.tsx:223
|
||||||
#: apps/web/src/components/settings/account-section.tsx:309
|
#: apps/web/src/components/settings/account-section.tsx:309
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr ""
|
msgstr "Admin"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:154
|
#: apps/web/src/routes/_app/settings.tsx:156
|
||||||
msgid "Admin only"
|
msgid "Admin only"
|
||||||
msgstr "Solo administradores"
|
msgstr "Solo administradores"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:249
|
#: apps/native/src/app/person/[id].tsx:189
|
||||||
#: apps/web/src/components/people/person-hero.tsx:89
|
#: apps/web/src/components/people/person-hero.tsx:89
|
||||||
msgid "age {age}"
|
msgid "age {age}"
|
||||||
msgstr "edad {age}"
|
msgstr "edad {age}"
|
||||||
@@ -243,7 +243,7 @@ msgstr "Ocurrió un error inesperado al cargar esta página. Puedes intentarlo d
|
|||||||
msgid "Anonymous usage reporting"
|
msgid "Anonymous usage reporting"
|
||||||
msgstr "Informe de uso anónimo"
|
msgstr "Informe de uso anónimo"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:135
|
#: apps/web/src/routes/_app/settings.tsx:137
|
||||||
msgid "App Settings"
|
msgid "App Settings"
|
||||||
msgstr "Ajustes de la app"
|
msgstr "Ajustes de la app"
|
||||||
|
|
||||||
@@ -251,7 +251,7 @@ msgstr "Ajustes de la app"
|
|||||||
msgid "Application"
|
msgid "Application"
|
||||||
msgstr "Aplicación"
|
msgstr "Aplicación"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:139
|
#: apps/native/src/components/settings/integration-card.tsx:148
|
||||||
msgid "Are you sure you want to disconnect {label}? The current URL will stop working."
|
msgid "Are you sure you want to disconnect {label}? The current URL will stop working."
|
||||||
msgstr "¿Seguro que quieres desconectar {label}? La URL actual dejará de funcionar."
|
msgstr "¿Seguro que quieres desconectar {label}? La URL actual dejará de funcionar."
|
||||||
|
|
||||||
@@ -310,7 +310,7 @@ msgid "Backup schedule"
|
|||||||
msgstr "Programación de copias de seguridad"
|
msgstr "Programación de copias de seguridad"
|
||||||
|
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:583
|
#: apps/web/src/components/settings/system-health-section.tsx:583
|
||||||
#: apps/web/src/routes/_app/settings.tsx:190
|
#: apps/web/src/routes/_app/settings.tsx:192
|
||||||
msgid "Backups"
|
msgid "Backups"
|
||||||
msgstr "Copias de seguridad"
|
msgstr "Copias de seguridad"
|
||||||
|
|
||||||
@@ -337,8 +337,9 @@ msgstr "No se puede contactar con el servidor"
|
|||||||
#: apps/native/src/components/header-avatar.tsx:63
|
#: apps/native/src/components/header-avatar.tsx:63
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:58
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:58
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:32
|
#: apps/native/src/components/search/recently-viewed-list.tsx:32
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:126
|
#: apps/native/src/components/settings/integration-card.tsx:135
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:141
|
#: apps/native/src/components/settings/integration-card.tsx:150
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:104
|
||||||
#: apps/web/src/components/settings/account-section.tsx:477
|
#: apps/web/src/components/settings/account-section.tsx:477
|
||||||
#: apps/web/src/components/settings/backup-restore-section.tsx:101
|
#: apps/web/src/components/settings/backup-restore-section.tsx:101
|
||||||
#: apps/web/src/components/settings/backup-section.tsx:240
|
#: apps/web/src/components/settings/backup-section.tsx:240
|
||||||
@@ -348,6 +349,7 @@ msgstr "No se puede contactar con el servidor"
|
|||||||
#: apps/web/src/components/settings/imports-section.tsx:611
|
#: apps/web/src/components/settings/imports-section.tsx:611
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:674
|
#: apps/web/src/components/settings/imports-section.tsx:674
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:798
|
#: apps/web/src/components/settings/imports-section.tsx:798
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:131
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:127
|
#: apps/web/src/components/titles/title-seasons.tsx:127
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
@@ -361,14 +363,20 @@ msgstr "Cancelar edición"
|
|||||||
msgid "Cast"
|
msgid "Cast"
|
||||||
msgstr "Reparto"
|
msgstr "Reparto"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:202
|
#: apps/web/src/components/titles/use-title-actions.ts:200
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:280
|
#: apps/web/src/components/titles/use-title-actions.ts:272
|
||||||
msgid "Catch up"
|
msgid "Catch up"
|
||||||
msgstr "Ponerse al día"
|
msgstr "Ponerse al día"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:50
|
||||||
|
#: apps/web/src/components/title-card.tsx:74
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:54
|
||||||
|
msgid "Caught Up"
|
||||||
|
msgstr "Al día"
|
||||||
|
|
||||||
#. placeholder {0}: episodeIds.length
|
#. placeholder {0}: episodeIds.length
|
||||||
#. placeholder {1}: episodeIds.length
|
#. placeholder {1}: episodeIds.length
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:72
|
#: apps/web/src/components/titles/use-title-actions.ts:69
|
||||||
msgid "Caught up — marked {0} {1, plural, one {episode} other {episodes}} as watched"
|
msgid "Caught up — marked {0} {1, plural, one {episode} other {episodes}} as watched"
|
||||||
msgstr "Al día — {0} {1, plural, one {episodio marcado como visto} other {episodios marcados como vistos}}"
|
msgstr "Al día — {0} {1, plural, one {episodio marcado como visto} other {episodios marcados como vistos}}"
|
||||||
|
|
||||||
@@ -418,7 +426,7 @@ msgstr "Elige cómo importar tus datos de {0}."
|
|||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:60
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:60
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:104
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:104
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:34
|
#: apps/native/src/components/search/recently-viewed-list.tsx:34
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:86
|
#: apps/native/src/components/search/recently-viewed-list.tsx:68
|
||||||
msgid "Clear"
|
msgid "Clear"
|
||||||
msgstr "Limpiar"
|
msgstr "Limpiar"
|
||||||
|
|
||||||
@@ -455,10 +463,10 @@ msgid "Close"
|
|||||||
msgstr "Cerrar"
|
msgstr "Cerrar"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:146
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:146
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:45
|
#: apps/native/src/components/titles/status-action-button.tsx:52
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:219
|
#: apps/web/src/components/dashboard/stats-display.tsx:219
|
||||||
#: apps/web/src/components/title-card.tsx:74
|
#: apps/web/src/components/title-card.tsx:79
|
||||||
#: apps/web/src/components/titles/status-button.tsx:25
|
#: apps/web/src/components/titles/status-button.tsx:59
|
||||||
msgid "Completed"
|
msgid "Completed"
|
||||||
msgstr "Completado"
|
msgstr "Completado"
|
||||||
|
|
||||||
@@ -477,7 +485,7 @@ msgstr "Conectar"
|
|||||||
msgid "Connect {0}"
|
msgid "Connect {0}"
|
||||||
msgstr "Conectar {0}"
|
msgstr "Conectar {0}"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:207
|
#: apps/native/src/components/settings/integration-card.tsx:216
|
||||||
msgid "Connect {label}"
|
msgid "Connect {label}"
|
||||||
msgstr "Conectar {label}"
|
msgstr "Conectar {label}"
|
||||||
|
|
||||||
@@ -485,7 +493,7 @@ msgstr "Conectar {label}"
|
|||||||
msgid "Connect to {source}"
|
msgid "Connect to {source}"
|
||||||
msgstr "Conectar con {source}"
|
msgstr "Conectar con {source}"
|
||||||
|
|
||||||
#: apps/web/src/routes/setup.tsx:98
|
#: apps/web/src/routes/setup.tsx:99
|
||||||
msgid "Connect to TMDB"
|
msgid "Connect to TMDB"
|
||||||
msgstr "Conectar con TMDB"
|
msgstr "Conectar con TMDB"
|
||||||
|
|
||||||
@@ -516,7 +524,7 @@ msgstr "Conectando al servidor..."
|
|||||||
msgid "Connecting..."
|
msgid "Connecting..."
|
||||||
msgstr "Conectando..."
|
msgstr "Conectando..."
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:207
|
#: apps/native/src/components/settings/integration-card.tsx:216
|
||||||
msgid "Connecting…"
|
msgid "Connecting…"
|
||||||
msgstr "Conectando…"
|
msgstr "Conectando…"
|
||||||
|
|
||||||
@@ -545,7 +553,7 @@ msgstr "Copiar URL"
|
|||||||
msgid "Could not load integrations"
|
msgid "Could not load integrations"
|
||||||
msgstr "No se pudieron cargar las integraciones"
|
msgstr "No se pudieron cargar las integraciones"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:172
|
#: apps/native/src/app/person/[id].tsx:257
|
||||||
msgid "Could not load person details"
|
msgid "Could not load person details"
|
||||||
msgstr "No se pudieron cargar los detalles de la persona"
|
msgstr "No se pudieron cargar los detalles de la persona"
|
||||||
|
|
||||||
@@ -579,14 +587,14 @@ msgstr "Contraseña actual"
|
|||||||
msgid "Current password is required"
|
msgid "Current password is required"
|
||||||
msgstr "La contraseña actual es obligatoria"
|
msgstr "La contraseña actual es obligatoria"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:216
|
#: apps/web/src/routes/_app/settings.tsx:218
|
||||||
msgid "Danger Zone"
|
msgid "Danger Zone"
|
||||||
msgstr "Zona de peligro"
|
msgstr "Zona de peligro"
|
||||||
|
|
||||||
#: apps/web/src/routes/__root.tsx:163
|
#: apps/web/src/routes/__root.tsx:163
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:76
|
#: apps/web/src/routes/_app/people.$id.tsx:78
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:119
|
#: apps/web/src/routes/_app/titles.$id.tsx:120
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:165
|
#: apps/web/src/routes/_app/titles.$id.tsx:166
|
||||||
msgid "Dashboard"
|
msgid "Dashboard"
|
||||||
msgstr "Panel"
|
msgstr "Panel"
|
||||||
|
|
||||||
@@ -630,29 +638,29 @@ msgstr "{0, plural, one {# archivo eliminado} other {# archivos eliminados}}, li
|
|||||||
msgid "Device code expired. Please try again."
|
msgid "Device code expired. Please try again."
|
||||||
msgstr "El código del dispositivo ha expirado. Por favor, inténtalo de nuevo."
|
msgstr "El código del dispositivo ha expirado. Por favor, inténtalo de nuevo."
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:249
|
#: apps/native/src/app/person/[id].tsx:189
|
||||||
#: apps/web/src/components/people/person-hero.tsx:89
|
#: apps/web/src/components/people/person-hero.tsx:89
|
||||||
msgid "died at {age}"
|
msgid "died at {age}"
|
||||||
msgstr "falleció a los {age}"
|
msgstr "falleció a los {age}"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:51
|
#: apps/native/src/app/person/[id].tsx:139
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:29
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:29
|
||||||
#: apps/web/src/components/people/person-hero.tsx:71
|
#: apps/web/src/components/people/person-hero.tsx:71
|
||||||
msgid "Director"
|
msgid "Director"
|
||||||
msgstr ""
|
msgstr "Director"
|
||||||
|
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:394
|
#: apps/web/src/components/settings/system-health-section.tsx:394
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:574
|
#: apps/web/src/components/settings/system-health-section.tsx:574
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "Desactivado"
|
msgstr "Desactivado"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:143
|
#: apps/native/src/components/settings/integration-card.tsx:152
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:257
|
#: apps/native/src/components/settings/integration-card.tsx:266
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:234
|
#: apps/web/src/components/settings/integration-card.tsx:234
|
||||||
msgid "Disconnect"
|
msgid "Disconnect"
|
||||||
msgstr "Desconectar"
|
msgstr "Desconectar"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:138
|
#: apps/native/src/components/settings/integration-card.tsx:147
|
||||||
msgid "Disconnect {label}"
|
msgid "Disconnect {label}"
|
||||||
msgstr "Desconectar {label}"
|
msgstr "Desconectar {label}"
|
||||||
|
|
||||||
@@ -685,11 +693,11 @@ msgstr "Descargar"
|
|||||||
msgid "Download backup"
|
msgid "Download backup"
|
||||||
msgstr "Descargar copia de seguridad"
|
msgstr "Descargar copia de seguridad"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:54
|
#: apps/native/src/app/person/[id].tsx:142
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:32
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:32
|
||||||
#: apps/web/src/components/people/person-hero.tsx:77
|
#: apps/web/src/components/people/person-hero.tsx:77
|
||||||
msgid "Editor"
|
msgid "Editor"
|
||||||
msgstr ""
|
msgstr "Editor"
|
||||||
|
|
||||||
#: apps/native/src/app/(auth)/login.tsx:123
|
#: apps/native/src/app/(auth)/login.tsx:123
|
||||||
#: apps/native/src/app/(auth)/register.tsx:139
|
#: apps/native/src/app/(auth)/register.tsx:139
|
||||||
@@ -729,24 +737,31 @@ msgstr "Introduce la URL de tu servidor Sofa para comenzar"
|
|||||||
msgid "Environment"
|
msgid "Environment"
|
||||||
msgstr "Entorno"
|
msgstr "Entorno"
|
||||||
|
|
||||||
#. placeholder {0}: episode.episodeNumber
|
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:27
|
#: apps/native/src/components/titles/episode-row.tsx:27
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:48
|
#: apps/native/src/components/titles/episode-row.tsx:48
|
||||||
msgid "Episode {0}"
|
#~ msgid "Episode {0}"
|
||||||
msgstr "Episodio {0}"
|
#~ msgstr "Episodio {0}"
|
||||||
|
|
||||||
#. placeholder {0}: episode.episodeNumber
|
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:34
|
#: apps/native/src/components/titles/episode-row.tsx:34
|
||||||
msgid "Episode {0}, {episodeLabel}"
|
#~ msgid "Episode {0}, {episodeLabel}"
|
||||||
msgstr "Episodio {0}, {episodeLabel}"
|
#~ msgstr "Episodio {0}, {episodeLabel}"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:111
|
#: apps/native/src/components/titles/episode-row.tsx:29
|
||||||
#: apps/native/src/lib/title-actions.ts:108
|
#: apps/native/src/components/titles/episode-row.tsx:52
|
||||||
|
msgid "Episode {episodeNumber}"
|
||||||
|
msgstr "Episodio {episodeNumber}"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/episode-row.tsx:38
|
||||||
|
msgid "Episode {episodeNumber}, {episodeLabel}"
|
||||||
|
msgstr "Episodio {episodeNumber}, {episodeLabel}"
|
||||||
|
|
||||||
|
#: apps/native/src/hooks/use-title-actions.ts:109
|
||||||
|
#: apps/native/src/lib/title-actions.ts:84
|
||||||
msgid "Episode unwatched"
|
msgid "Episode unwatched"
|
||||||
msgstr "Episodio marcado como no visto"
|
msgstr "Episodio marcado como no visto"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:101
|
#: apps/native/src/hooks/use-title-actions.ts:99
|
||||||
#: apps/native/src/lib/title-actions.ts:98
|
#: apps/native/src/lib/title-actions.ts:74
|
||||||
msgid "Episode watched"
|
msgid "Episode watched"
|
||||||
msgstr "Episodio marcado como visto"
|
msgstr "Episodio marcado como visto"
|
||||||
|
|
||||||
@@ -758,7 +773,7 @@ msgstr "Episodios"
|
|||||||
#. placeholder {0}: periodLabels[episodePeriod]
|
#. placeholder {0}: periodLabels[episodePeriod]
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:125
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:125
|
||||||
msgid "Episodes {0}"
|
msgid "Episodes {0}"
|
||||||
msgstr ""
|
msgstr "Episodios {0}"
|
||||||
|
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:162
|
#: apps/web/src/components/dashboard/stats-display.tsx:162
|
||||||
#~ msgid "Episodes {periodSelect}"
|
#~ msgid "Episodes {periodSelect}"
|
||||||
@@ -775,7 +790,7 @@ msgstr "Episodios {select}"
|
|||||||
#: apps/native/src/app/change-password.tsx:67
|
#: apps/native/src/app/change-password.tsx:67
|
||||||
#: apps/native/src/app/change-password.tsx:77
|
#: apps/native/src/app/change-password.tsx:77
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr ""
|
msgstr "Error"
|
||||||
|
|
||||||
#. placeholder {0}: result.errors.length
|
#. placeholder {0}: result.errors.length
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:887
|
#: apps/web/src/components/settings/imports-section.tsx:887
|
||||||
@@ -790,8 +805,8 @@ msgstr "Errores ({0})"
|
|||||||
msgid "Explore"
|
msgid "Explore"
|
||||||
msgstr "Explorar"
|
msgstr "Explorar"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:68
|
#: apps/web/src/routes/_app/people.$id.tsx:70
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:157
|
#: apps/web/src/routes/_app/titles.$id.tsx:158
|
||||||
msgid "Explore titles"
|
msgid "Explore titles"
|
||||||
msgstr "Explorar títulos"
|
msgstr "Explorar títulos"
|
||||||
|
|
||||||
@@ -804,7 +819,7 @@ msgstr "Fallido"
|
|||||||
msgid "Failed to add to watchlist"
|
msgid "Failed to add to watchlist"
|
||||||
msgstr "Error al añadir a la lista"
|
msgstr "Error al añadir a la lista"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:80
|
#: apps/web/src/components/titles/use-title-actions.ts:77
|
||||||
msgid "Failed to catch up"
|
msgid "Failed to catch up"
|
||||||
msgstr "Error al ponerse al día"
|
msgstr "Error al ponerse al día"
|
||||||
|
|
||||||
@@ -817,7 +832,7 @@ msgstr "Error al cambiar la contraseña"
|
|||||||
msgid "Failed to connect"
|
msgid "Failed to connect"
|
||||||
msgstr "Error al conectar"
|
msgstr "Error al conectar"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:87
|
#: apps/native/src/components/settings/integration-card.tsx:89
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:91
|
#: apps/web/src/components/settings/integration-card.tsx:91
|
||||||
msgid "Failed to connect {label}"
|
msgid "Failed to connect {label}"
|
||||||
msgstr "Error al conectar {label}"
|
msgstr "Error al conectar {label}"
|
||||||
@@ -834,7 +849,7 @@ msgstr "Error al crear la copia de seguridad"
|
|||||||
msgid "Failed to delete backup"
|
msgid "Failed to delete backup"
|
||||||
msgstr "Error al eliminar la copia de seguridad"
|
msgstr "Error al eliminar la copia de seguridad"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:97
|
#: apps/native/src/components/settings/integration-card.tsx:99
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:108
|
#: apps/web/src/components/settings/integration-card.tsx:108
|
||||||
msgid "Failed to disconnect {label}"
|
msgid "Failed to disconnect {label}"
|
||||||
msgstr "Error al desconectar {label}"
|
msgstr "Error al desconectar {label}"
|
||||||
@@ -843,29 +858,30 @@ msgstr "Error al desconectar {label}"
|
|||||||
msgid "Failed to load backup schedule settings."
|
msgid "Failed to load backup schedule settings."
|
||||||
msgstr "Error al cargar los ajustes de programación de copias de seguridad."
|
msgstr "Error al cargar los ajustes de programación de copias de seguridad."
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:110
|
#: apps/web/src/routes/_app/titles.$id.tsx:111
|
||||||
msgid "Failed to load title"
|
msgid "Failed to load title"
|
||||||
msgstr "Error al cargar el título"
|
msgstr "Error al cargar el título"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:344
|
#: apps/native/src/lib/title-actions.ts:101
|
||||||
|
#: apps/web/src/components/titles/use-title-actions.ts:338
|
||||||
msgid "Failed to mark all episodes as watched"
|
msgid "Failed to mark all episodes as watched"
|
||||||
msgstr "Error al marcar todos los episodios como vistos"
|
msgstr "Error al marcar todos los episodios como vistos"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:79
|
#: apps/native/src/hooks/use-title-actions.ts:77
|
||||||
#: apps/native/src/lib/title-actions.ts:67
|
#: apps/native/src/lib/title-actions.ts:43
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:137
|
#: apps/web/src/components/titles/use-title-actions.ts:134
|
||||||
msgid "Failed to mark as watched"
|
msgid "Failed to mark as watched"
|
||||||
msgstr "Error al marcar como visto"
|
msgstr "Error al marcar como visto"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:104
|
#: apps/native/src/hooks/use-title-actions.ts:102
|
||||||
#: apps/native/src/lib/title-actions.ts:101
|
#: apps/native/src/lib/title-actions.ts:77
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:216
|
#: apps/web/src/components/titles/use-title-actions.ts:214
|
||||||
msgid "Failed to mark episode"
|
msgid "Failed to mark episode"
|
||||||
msgstr "Error al marcar el episodio"
|
msgstr "Error al marcar el episodio"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:124
|
#: apps/native/src/hooks/use-title-actions.ts:122
|
||||||
#: apps/native/src/lib/title-actions.ts:123
|
#: apps/native/src/lib/title-actions.ts:113
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:294
|
#: apps/web/src/components/titles/use-title-actions.ts:286
|
||||||
msgid "Failed to mark some episodes"
|
msgid "Failed to mark some episodes"
|
||||||
msgstr "Error al marcar algunos episodios"
|
msgstr "Error al marcar algunos episodios"
|
||||||
|
|
||||||
@@ -889,12 +905,12 @@ msgstr "Error al purgar la caché de imágenes"
|
|||||||
msgid "Failed to purge metadata cache"
|
msgid "Failed to purge metadata cache"
|
||||||
msgstr "Error al purgar la caché de metadatos"
|
msgstr "Error al purgar la caché de metadatos"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:107
|
#: apps/native/src/components/settings/integration-card.tsx:109
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:121
|
#: apps/web/src/components/settings/integration-card.tsx:121
|
||||||
msgid "Failed to regenerate {label} URL"
|
msgid "Failed to regenerate {label} URL"
|
||||||
msgstr "Error al regenerar la URL de {label}"
|
msgstr "Error al regenerar la URL de {label}"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:77
|
#: apps/native/src/lib/title-actions.ts:53
|
||||||
msgid "Failed to remove from library"
|
msgid "Failed to remove from library"
|
||||||
msgstr "Error al eliminar de la biblioteca"
|
msgstr "Error al eliminar de la biblioteca"
|
||||||
|
|
||||||
@@ -916,13 +932,13 @@ msgstr "Error al iniciar la conexión con {0}"
|
|||||||
msgid "Failed to trigger job"
|
msgid "Failed to trigger job"
|
||||||
msgstr "Error al iniciar la tarea"
|
msgstr "Error al iniciar la tarea"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:114
|
#: apps/native/src/hooks/use-title-actions.ts:112
|
||||||
#: apps/native/src/lib/title-actions.ts:111
|
#: apps/native/src/lib/title-actions.ts:87
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:163
|
#: apps/web/src/components/titles/use-title-actions.ts:161
|
||||||
msgid "Failed to unmark episode"
|
msgid "Failed to unmark episode"
|
||||||
msgstr "Error al desmarcar el episodio"
|
msgstr "Error al desmarcar el episodio"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:320
|
#: apps/web/src/components/titles/use-title-actions.ts:312
|
||||||
msgid "Failed to unmark some episodes"
|
msgid "Failed to unmark some episodes"
|
||||||
msgstr "Error al desmarcar algunos episodios"
|
msgstr "Error al desmarcar algunos episodios"
|
||||||
|
|
||||||
@@ -930,9 +946,9 @@ msgstr "Error al desmarcar algunos episodios"
|
|||||||
msgid "Failed to update name"
|
msgid "Failed to update name"
|
||||||
msgstr "Error al actualizar el nombre"
|
msgstr "Error al actualizar el nombre"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:94
|
#: apps/native/src/hooks/use-title-actions.ts:92
|
||||||
#: apps/native/src/lib/title-actions.ts:91
|
#: apps/native/src/lib/title-actions.ts:67
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:123
|
#: apps/web/src/components/titles/use-title-actions.ts:120
|
||||||
msgid "Failed to update rating"
|
msgid "Failed to update rating"
|
||||||
msgstr "Error al actualizar la valoración"
|
msgstr "Error al actualizar la valoración"
|
||||||
|
|
||||||
@@ -958,10 +974,8 @@ msgstr "Error al actualizar el ajuste de copia de seguridad programada"
|
|||||||
msgid "Failed to update setting"
|
msgid "Failed to update setting"
|
||||||
msgstr "Error al actualizar el ajuste"
|
msgstr "Error al actualizar el ajuste"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:69
|
#: apps/native/src/hooks/use-title-actions.ts:67
|
||||||
#: apps/native/src/lib/title-actions.ts:41
|
#: apps/web/src/components/titles/use-title-actions.ts:98
|
||||||
#: apps/native/src/lib/title-actions.ts:55
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:101
|
|
||||||
msgid "Failed to update status"
|
msgid "Failed to update status"
|
||||||
msgstr "Error al actualizar el estado"
|
msgstr "Error al actualizar el estado"
|
||||||
|
|
||||||
@@ -973,7 +987,7 @@ msgstr "Error al subir el avatar"
|
|||||||
msgid "Fetching your library data from {source}..."
|
msgid "Fetching your library data from {source}..."
|
||||||
msgstr "Obteniendo datos de tu biblioteca desde {source}..."
|
msgstr "Obteniendo datos de tu biblioteca desde {source}..."
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:279
|
#: apps/native/src/app/person/[id].tsx:219
|
||||||
#: apps/web/src/components/people/filmography-grid.tsx:67
|
#: apps/web/src/components/people/filmography-grid.tsx:67
|
||||||
msgid "Filmography"
|
msgid "Filmography"
|
||||||
msgstr "Filmografía"
|
msgstr "Filmografía"
|
||||||
@@ -1002,8 +1016,8 @@ msgstr "Viernes"
|
|||||||
msgid "Get Started"
|
msgid "Get Started"
|
||||||
msgstr "Comenzar"
|
msgstr "Comenzar"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:176
|
#: apps/native/src/app/person/[id].tsx:261
|
||||||
#: apps/native/src/app/person/[id].tsx:196
|
#: apps/native/src/app/person/[id].tsx:281
|
||||||
#: apps/native/src/app/title/[id].tsx:235
|
#: apps/native/src/app/title/[id].tsx:235
|
||||||
msgid "Go back"
|
msgid "Go back"
|
||||||
msgstr "Volver"
|
msgstr "Volver"
|
||||||
@@ -1112,6 +1126,11 @@ msgstr "En la biblioteca"
|
|||||||
msgid "In Library"
|
msgid "In Library"
|
||||||
msgstr "En la biblioteca"
|
msgstr "En la biblioteca"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:46
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:40
|
||||||
|
msgid "In Watchlist"
|
||||||
|
msgstr "En lista de seguimiento"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:179
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:179
|
||||||
#: apps/web/src/components/dashboard/library-section.tsx:35
|
#: apps/web/src/components/dashboard/library-section.tsx:35
|
||||||
msgid "In Your Library"
|
msgid "In Your Library"
|
||||||
@@ -1222,22 +1241,23 @@ msgid "Mark all episodes as watched?"
|
|||||||
msgstr "¿Marcar todos los episodios como vistos?"
|
msgstr "¿Marcar todos los episodios como vistos?"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:152
|
#: apps/native/src/components/titles/season-accordion.tsx:152
|
||||||
|
#: apps/native/src/components/ui/poster-card.tsx:229
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:109
|
#: apps/web/src/components/titles/title-seasons.tsx:109
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:135
|
#: apps/web/src/components/titles/title-seasons.tsx:135
|
||||||
msgid "Mark All Watched"
|
msgid "Mark All Watched"
|
||||||
msgstr "Marcar todos como vistos"
|
msgstr "Marcar todos como vistos"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/continue-watching-card.tsx:103
|
#: apps/native/src/components/dashboard/continue-watching-card.tsx:103
|
||||||
msgid "Mark as Completed"
|
#~ msgid "Mark as Completed"
|
||||||
msgstr "Marcar como completado"
|
#~ msgstr "Marcar como completado"
|
||||||
|
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:226
|
#: apps/native/src/components/ui/poster-card.tsx:222
|
||||||
msgid "Mark as Watched"
|
msgid "Mark as Watched"
|
||||||
msgstr "Marcar como visto"
|
msgstr "Marcar como visto"
|
||||||
|
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:219
|
#: apps/native/src/components/ui/poster-card.tsx:219
|
||||||
msgid "Mark as Watching"
|
#~ msgid "Mark as Watching"
|
||||||
msgstr "Marcar como en curso"
|
#~ msgstr "Marcar como en curso"
|
||||||
|
|
||||||
#: apps/native/src/app/title/[id].tsx:400
|
#: apps/native/src/app/title/[id].tsx:400
|
||||||
#: apps/web/src/components/titles/title-actions.tsx:27
|
#: apps/web/src/components/titles/title-actions.tsx:27
|
||||||
@@ -1245,32 +1265,37 @@ msgid "Mark Watched"
|
|||||||
msgstr "Marcar como visto"
|
msgstr "Marcar como visto"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:50
|
#: apps/native/src/lib/title-actions.ts:50
|
||||||
msgid "Marked \"{titleName}\" as completed"
|
#~ msgid "Marked \"{titleName}\" as completed"
|
||||||
msgstr "\"{titleName}\" marcado como completado"
|
#~ msgstr "\"{titleName}\" marcado como completado"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:63
|
#: apps/native/src/lib/title-actions.ts:39
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:134
|
#: apps/web/src/components/titles/use-title-actions.ts:131
|
||||||
msgid "Marked \"{titleName}\" as watched"
|
msgid "Marked \"{titleName}\" as watched"
|
||||||
msgstr "\"{titleName}\" marcado como visto"
|
msgstr "\"{titleName}\" marcado como visto"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:337
|
#: apps/native/src/lib/title-actions.ts:97
|
||||||
|
#: apps/web/src/components/titles/use-title-actions.ts:331
|
||||||
msgid "Marked all episodes as watched"
|
msgid "Marked all episodes as watched"
|
||||||
msgstr "Todos los episodios marcados como vistos"
|
msgstr "Todos los episodios marcados como vistos"
|
||||||
|
|
||||||
|
#: apps/native/src/lib/title-actions.ts:96
|
||||||
|
msgid "Marked all episodes of \"{titleName}\" as watched"
|
||||||
|
msgstr "Se marcaron todos los episodios de \"{titleName}\" como vistos"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:61
|
#: apps/native/src/hooks/use-title-actions.ts:61
|
||||||
#: apps/native/src/lib/title-actions.ts:51
|
#: apps/native/src/lib/title-actions.ts:51
|
||||||
msgid "Marked as completed"
|
#~ msgid "Marked as completed"
|
||||||
msgstr "Marcado como completado"
|
#~ msgstr "Marcado como completado"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:76
|
#: apps/native/src/hooks/use-title-actions.ts:74
|
||||||
#: apps/native/src/lib/title-actions.ts:63
|
#: apps/native/src/lib/title-actions.ts:39
|
||||||
msgid "Marked as watched"
|
msgid "Marked as watched"
|
||||||
msgstr "Marcado como visto"
|
msgstr "Marcado como visto"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:60
|
#: apps/native/src/hooks/use-title-actions.ts:60
|
||||||
#: apps/native/src/lib/title-actions.ts:38
|
#: apps/native/src/lib/title-actions.ts:38
|
||||||
msgid "Marked as watching"
|
#~ msgid "Marked as watching"
|
||||||
msgstr "Marcado como en curso"
|
#~ msgstr "Marcado como en curso"
|
||||||
|
|
||||||
#: apps/web/src/components/settings/account-section.tsx:314
|
#: apps/web/src/components/settings/account-section.tsx:314
|
||||||
msgid "Member since {memberSince}"
|
msgid "Member since {memberSince}"
|
||||||
@@ -1305,7 +1330,7 @@ msgstr "Películas"
|
|||||||
#. placeholder {0}: periodLabels[moviePeriod]
|
#. placeholder {0}: periodLabels[moviePeriod]
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:114
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:114
|
||||||
msgid "Movies {0}"
|
msgid "Movies {0}"
|
||||||
msgstr ""
|
msgstr "Películas {0}"
|
||||||
|
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:161
|
#: apps/web/src/components/dashboard/stats-display.tsx:161
|
||||||
#~ msgid "Movies {periodSelect}"
|
#~ msgid "Movies {periodSelect}"
|
||||||
@@ -1345,7 +1370,7 @@ msgstr "Nunca ejecutado"
|
|||||||
msgid "New account creation is currently disabled."
|
msgid "New account creation is currently disabled."
|
||||||
msgstr "La creación de nuevas cuentas está desactivada actualmente."
|
msgstr "La creación de nuevas cuentas está desactivada actualmente."
|
||||||
|
|
||||||
#: apps/web/src/routes/_auth/register.tsx:36
|
#: apps/web/src/routes/_auth/register.tsx:33
|
||||||
msgid "New accounts are not being accepted right now. Contact the admin if you need access."
|
msgid "New accounts are not being accepted right now. Contact the admin if you need access."
|
||||||
msgstr "No se aceptan nuevas cuentas en este momento. Contacta al administrador si necesitas acceso."
|
msgstr "No se aceptan nuevas cuentas en este momento. Contacta al administrador si necesitas acceso."
|
||||||
|
|
||||||
@@ -1403,7 +1428,7 @@ msgstr "No se encontraron resultados."
|
|||||||
msgid "No titles found for this genre."
|
msgid "No titles found for this genre."
|
||||||
msgstr "No se encontraron títulos para este género."
|
msgstr "No se encontraron títulos para este género."
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:174
|
#: apps/native/src/components/settings/integration-card.tsx:183
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:153
|
#: apps/web/src/components/settings/integration-card.tsx:153
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:229
|
#: apps/web/src/components/settings/system-health-section.tsx:229
|
||||||
msgid "Not configured"
|
msgid "Not configured"
|
||||||
@@ -1517,8 +1542,8 @@ msgstr "Comprobar periódicamente GitHub para nuevas versiones de Sofa"
|
|||||||
msgid "Person"
|
msgid "Person"
|
||||||
msgstr "Persona"
|
msgstr "Persona"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:192
|
#: apps/native/src/app/person/[id].tsx:277
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:50
|
#: apps/web/src/routes/_app/people.$id.tsx:52
|
||||||
msgid "Person not found"
|
msgid "Person not found"
|
||||||
msgstr "Persona no encontrada"
|
msgstr "Persona no encontrada"
|
||||||
|
|
||||||
@@ -1527,12 +1552,12 @@ msgid "Play trailer"
|
|||||||
msgstr "Reproducir tráiler"
|
msgstr "Reproducir tráiler"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:89
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:89
|
||||||
#: apps/web/src/routes/_app/explore.tsx:141
|
#: apps/web/src/routes/_app/explore.tsx:143
|
||||||
msgid "Popular Movies"
|
msgid "Popular Movies"
|
||||||
msgstr "Películas populares"
|
msgstr "Películas populares"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:102
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:102
|
||||||
#: apps/web/src/routes/_app/explore.tsx:151
|
#: apps/web/src/routes/_app/explore.tsx:153
|
||||||
msgid "Popular TV Shows"
|
msgid "Popular TV Shows"
|
||||||
msgstr "Series populares"
|
msgstr "Series populares"
|
||||||
|
|
||||||
@@ -1540,7 +1565,7 @@ msgstr "Series populares"
|
|||||||
msgid "Pre-restore backup"
|
msgid "Pre-restore backup"
|
||||||
msgstr "Copia de seguridad previa a restauración"
|
msgstr "Copia de seguridad previa a restauración"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:53
|
#: apps/native/src/app/person/[id].tsx:141
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:31
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:31
|
||||||
#: apps/web/src/components/people/person-hero.tsx:75
|
#: apps/web/src/components/people/person-hero.tsx:75
|
||||||
msgid "Producer"
|
msgid "Producer"
|
||||||
@@ -1612,7 +1637,7 @@ msgstr "URL de lista de Radarr"
|
|||||||
|
|
||||||
#. placeholder {0}: input.stars
|
#. placeholder {0}: input.stars
|
||||||
#. placeholder {1}: input.stars
|
#. placeholder {1}: input.stars
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:88
|
#: apps/native/src/hooks/use-title-actions.ts:86
|
||||||
msgid "Rated {0} {1, plural, one {star} other {stars}}"
|
msgid "Rated {0} {1, plural, one {star} other {stars}}"
|
||||||
msgstr "Valorado con {0} {1, plural, one {estrella} other {estrellas}}"
|
msgstr "Valorado con {0} {1, plural, one {estrella} other {estrellas}}"
|
||||||
|
|
||||||
@@ -1620,11 +1645,11 @@ msgstr "Valorado con {0} {1, plural, one {estrella} other {estrellas}}"
|
|||||||
#~ msgid "Rated {0} star{1}"
|
#~ msgid "Rated {0} star{1}"
|
||||||
#~ msgstr "Rated {0} star{1}"
|
#~ msgstr "Rated {0} star{1}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:118
|
#: apps/web/src/components/titles/use-title-actions.ts:115
|
||||||
msgid "Rated {ratingStars} {ratingStars, plural, one {star} other {stars}}"
|
msgid "Rated {ratingStars} {ratingStars, plural, one {star} other {stars}}"
|
||||||
msgstr "Valorado con {ratingStars} {ratingStars, plural, one {estrella} other {estrellas}}"
|
msgstr "Valorado con {ratingStars} {ratingStars, plural, one {estrella} other {estrellas}}"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:86
|
#: apps/native/src/lib/title-actions.ts:62
|
||||||
msgid "Rated {stars, plural, one {# star} other {# stars}}"
|
msgid "Rated {stars, plural, one {# star} other {# stars}}"
|
||||||
msgstr "Valorado con {stars, plural, one {# estrella} other {# estrellas}}"
|
msgstr "Valorado con {stars, plural, one {# estrella} other {# estrellas}}"
|
||||||
|
|
||||||
@@ -1633,9 +1658,9 @@ msgstr "Valorado con {stars, plural, one {# estrella} other {# estrellas}}"
|
|||||||
msgid "Rating"
|
msgid "Rating"
|
||||||
msgstr "Valoración"
|
msgstr "Valoración"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:89
|
#: apps/native/src/hooks/use-title-actions.ts:87
|
||||||
#: apps/native/src/lib/title-actions.ts:87
|
#: apps/native/src/lib/title-actions.ts:63
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:119
|
#: apps/web/src/components/titles/use-title-actions.ts:116
|
||||||
msgid "Rating removed"
|
msgid "Rating removed"
|
||||||
msgstr "Valoración eliminada"
|
msgstr "Valoración eliminada"
|
||||||
|
|
||||||
@@ -1663,7 +1688,7 @@ msgid "Recent Searches"
|
|||||||
msgstr "Búsquedas recientes"
|
msgstr "Búsquedas recientes"
|
||||||
|
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:95
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:95
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:77
|
#: apps/native/src/components/search/recently-viewed-list.tsx:59
|
||||||
msgid "Recently Viewed"
|
msgid "Recently Viewed"
|
||||||
msgstr "Vistos recientemente"
|
msgstr "Vistos recientemente"
|
||||||
|
|
||||||
@@ -1692,12 +1717,12 @@ msgstr "Actualizar"
|
|||||||
msgid "Refresh system health"
|
msgid "Refresh system health"
|
||||||
msgstr "Actualizar estado del sistema"
|
msgstr "Actualizar estado del sistema"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:128
|
#: apps/native/src/components/settings/integration-card.tsx:137
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:248
|
#: apps/native/src/components/settings/integration-card.tsx:257
|
||||||
msgid "Regenerate"
|
msgid "Regenerate"
|
||||||
msgstr "Regenerar"
|
msgstr "Regenerar"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:123
|
#: apps/native/src/components/settings/integration-card.tsx:132
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:226
|
#: apps/web/src/components/settings/integration-card.tsx:226
|
||||||
msgid "Regenerate URL"
|
msgid "Regenerate URL"
|
||||||
msgstr "Regenerar URL"
|
msgstr "Regenerar URL"
|
||||||
@@ -1717,7 +1742,7 @@ msgid "Registration closed"
|
|||||||
msgstr "Registro cerrado"
|
msgstr "Registro cerrado"
|
||||||
|
|
||||||
#: apps/native/src/app/(auth)/register.tsx:87
|
#: apps/native/src/app/(auth)/register.tsx:87
|
||||||
#: apps/web/src/routes/_auth/register.tsx:33
|
#: apps/web/src/routes/_auth/register.tsx:30
|
||||||
msgid "Registration Closed"
|
msgid "Registration Closed"
|
||||||
msgstr "Registro cerrado"
|
msgstr "Registro cerrado"
|
||||||
|
|
||||||
@@ -1726,20 +1751,27 @@ msgstr "Registro cerrado"
|
|||||||
msgid "Registration opened"
|
msgid "Registration opened"
|
||||||
msgstr "Registro abierto"
|
msgstr "Registro abierto"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/status-button.tsx:76
|
#: apps/native/src/components/titles/status-action-button.tsx:106
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:109
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:139
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Eliminar"
|
msgstr "Eliminar"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:96
|
#: apps/native/src/components/titles/status-action-button.tsx:115
|
||||||
#: apps/web/src/components/titles/status-button.tsx:60
|
#: apps/web/src/components/titles/status-button.tsx:93
|
||||||
msgid "Remove from library"
|
msgid "Remove from library"
|
||||||
msgstr "Eliminar de la biblioteca"
|
msgstr "Eliminar de la biblioteca"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/continue-watching-card.tsx:108
|
#: apps/native/src/components/dashboard/continue-watching-card.tsx:108
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:233
|
#: apps/native/src/components/ui/poster-card.tsx:236
|
||||||
msgid "Remove from Library"
|
msgid "Remove from Library"
|
||||||
msgstr "Eliminar de la biblioteca"
|
msgstr "Eliminar de la biblioteca"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:101
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:120
|
||||||
|
msgid "Remove from library?"
|
||||||
|
msgstr "¿Eliminar de la biblioteca?"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:268
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:268
|
||||||
msgid "Remove Photo"
|
msgid "Remove Photo"
|
||||||
msgstr "Eliminar foto"
|
msgstr "Eliminar foto"
|
||||||
@@ -1752,9 +1784,9 @@ msgstr "Eliminar foto"
|
|||||||
msgid "Remove profile picture"
|
msgid "Remove profile picture"
|
||||||
msgstr "Eliminar foto de perfil"
|
msgstr "Eliminar foto de perfil"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:65
|
#: apps/native/src/hooks/use-title-actions.ts:63
|
||||||
#: apps/native/src/lib/title-actions.ts:74
|
#: apps/native/src/lib/title-actions.ts:50
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:98
|
#: apps/web/src/components/titles/use-title-actions.ts:95
|
||||||
msgid "Removed from library"
|
msgid "Removed from library"
|
||||||
msgstr "Eliminado de la biblioteca"
|
msgstr "Eliminado de la biblioteca"
|
||||||
|
|
||||||
@@ -1861,14 +1893,14 @@ msgstr "Copias de seguridad programadas activadas"
|
|||||||
#: apps/native/src/app/(tabs)/(search)/_layout.tsx:7
|
#: apps/native/src/app/(tabs)/(search)/_layout.tsx:7
|
||||||
#: apps/native/src/components/navigation/native-tab-bar.tsx:41
|
#: apps/native/src/components/navigation/native-tab-bar.tsx:41
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr ""
|
msgstr "Buscar"
|
||||||
|
|
||||||
#: apps/web/src/components/dashboard/stats-section.tsx:35
|
#: apps/web/src/components/dashboard/stats-section.tsx:35
|
||||||
msgid "Search for movies and TV shows to start tracking"
|
msgid "Search for movies and TV shows to start tracking"
|
||||||
msgstr "Busca películas y series para empezar a seguirlas"
|
msgstr "Busca películas y series para empezar a seguirlas"
|
||||||
|
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:72
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:72
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:55
|
#: apps/native/src/components/search/recently-viewed-list.tsx:81
|
||||||
msgid "Search for movies, shows, or people"
|
msgid "Search for movies, shows, or people"
|
||||||
msgstr "Busca películas, series o personas"
|
msgstr "Busca películas, series o personas"
|
||||||
|
|
||||||
@@ -1892,13 +1924,13 @@ msgstr "Buscar…"
|
|||||||
#. placeholder {0}: season.seasonNumber
|
#. placeholder {0}: season.seasonNumber
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:113
|
#: apps/native/src/components/titles/season-accordion.tsx:113
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:119
|
#: apps/native/src/components/titles/season-accordion.tsx:119
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:274
|
#: apps/web/src/components/titles/use-title-actions.ts:266
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:313
|
#: apps/web/src/components/titles/use-title-actions.ts:305
|
||||||
msgid "Season {0}"
|
msgid "Season {0}"
|
||||||
msgstr "Temporada {0}"
|
msgstr "Temporada {0}"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:121
|
#: apps/native/src/hooks/use-title-actions.ts:119
|
||||||
#: apps/native/src/lib/title-actions.ts:119
|
#: apps/native/src/lib/title-actions.ts:109
|
||||||
msgid "Season watched"
|
msgid "Season watched"
|
||||||
msgstr "Temporada marcada como vista"
|
msgstr "Temporada marcada como vista"
|
||||||
|
|
||||||
@@ -1907,7 +1939,7 @@ msgid "Seasons"
|
|||||||
msgstr "Temporadas"
|
msgstr "Temporadas"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:452
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:452
|
||||||
#: apps/web/src/routes/_app/settings.tsx:167
|
#: apps/web/src/routes/_app/settings.tsx:169
|
||||||
msgid "Security"
|
msgid "Security"
|
||||||
msgstr "Seguridad"
|
msgstr "Seguridad"
|
||||||
|
|
||||||
@@ -1915,7 +1947,7 @@ msgstr "Seguridad"
|
|||||||
msgid "Self-hosted movie & TV tracker"
|
msgid "Self-hosted movie & TV tracker"
|
||||||
msgstr "Seguimiento de películas y series autoalojado"
|
msgstr "Seguimiento de películas y series autoalojado"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:151
|
#: apps/web/src/routes/_app/settings.tsx:153
|
||||||
msgid "Server"
|
msgid "Server"
|
||||||
msgstr "Servidor"
|
msgstr "Servidor"
|
||||||
|
|
||||||
@@ -1947,12 +1979,12 @@ msgstr "Configura tu perfil de calidad y carpeta raíz preferidos"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Ajustes"
|
msgstr "Ajustes"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:271
|
#: apps/native/src/components/settings/integration-card.tsx:280
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:248
|
#: apps/web/src/components/settings/integration-card.tsx:248
|
||||||
msgid "Setup instructions"
|
msgid "Setup instructions"
|
||||||
msgstr "Instrucciones de configuración"
|
msgstr "Instrucciones de configuración"
|
||||||
|
|
||||||
#: apps/web/src/routes/setup.tsx:95
|
#: apps/web/src/routes/setup.tsx:96
|
||||||
msgid "Setup required"
|
msgid "Setup required"
|
||||||
msgstr "Configuración requerida"
|
msgstr "Configuración requerida"
|
||||||
|
|
||||||
@@ -1977,7 +2009,7 @@ msgstr "Iniciar sesión"
|
|||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Iniciar sesión"
|
msgstr "Iniciar sesión"
|
||||||
|
|
||||||
#: apps/web/src/routes/_auth/register.tsx:45
|
#: apps/web/src/routes/_auth/register.tsx:42
|
||||||
msgid "Sign in instead"
|
msgid "Sign in instead"
|
||||||
msgstr "Iniciar sesión"
|
msgstr "Iniciar sesión"
|
||||||
|
|
||||||
@@ -2031,13 +2063,13 @@ msgid "Sofa will automatically log movies and episodes when you finish watching
|
|||||||
msgstr "Sofa registrará automáticamente películas y episodios cuando termines de verlos"
|
msgstr "Sofa registrará automáticamente películas y episodios cuando termines de verlos"
|
||||||
|
|
||||||
#: apps/native/src/app/change-password.tsx:77
|
#: apps/native/src/app/change-password.tsx:77
|
||||||
#: apps/native/src/app/person/[id].tsx:169
|
#: apps/native/src/app/person/[id].tsx:254
|
||||||
#: apps/web/src/components/settings/account-section.tsx:391
|
#: apps/web/src/components/settings/account-section.tsx:391
|
||||||
#: apps/web/src/routes/__root.tsx:139
|
#: apps/web/src/routes/__root.tsx:139
|
||||||
msgid "Something went wrong"
|
msgid "Something went wrong"
|
||||||
msgstr "Algo salió mal"
|
msgstr "Algo salió mal"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:113
|
#: apps/web/src/routes/_app/titles.$id.tsx:114
|
||||||
msgid "Something went wrong while loading this title. Please try again."
|
msgid "Something went wrong while loading this title. Please try again."
|
||||||
msgstr "Algo salió mal al cargar este título. Por favor, inténtalo de nuevo."
|
msgstr "Algo salió mal al cargar este título. Por favor, inténtalo de nuevo."
|
||||||
|
|
||||||
@@ -2070,7 +2102,7 @@ msgstr "Comenzando a las"
|
|||||||
msgid "Starting import..."
|
msgid "Starting import..."
|
||||||
msgstr "Iniciando importación..."
|
msgstr "Iniciando importación..."
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:64
|
#: apps/native/src/hooks/use-title-actions.ts:62
|
||||||
msgid "Status updated"
|
msgid "Status updated"
|
||||||
msgstr "Estado actualizado"
|
msgstr "Estado actualizado"
|
||||||
|
|
||||||
@@ -2095,11 +2127,11 @@ msgstr "Cambiar a {0}"
|
|||||||
msgid "The page you're looking for doesn't exist."
|
msgid "The page you're looking for doesn't exist."
|
||||||
msgstr "La página que buscas no existe."
|
msgstr "La página que buscas no existe."
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:53
|
#: apps/web/src/routes/_app/people.$id.tsx:55
|
||||||
msgid "The person you're looking for doesn't exist or may have been removed from the database."
|
msgid "The person you're looking for doesn't exist or may have been removed from the database."
|
||||||
msgstr "La persona que buscas no existe o puede haber sido eliminada de la base de datos."
|
msgstr "La persona que buscas no existe o puede haber sido eliminada de la base de datos."
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:142
|
#: apps/web/src/routes/_app/titles.$id.tsx:143
|
||||||
msgid "The title you're looking for doesn't exist or may have been removed from the database."
|
msgid "The title you're looking for doesn't exist or may have been removed from the database."
|
||||||
msgstr "El título que buscas no existe o puede haber sido eliminado de la base de datos."
|
msgstr "El título que buscas no existe o puede haber sido eliminado de la base de datos."
|
||||||
|
|
||||||
@@ -2109,7 +2141,7 @@ msgstr "Esto puede tardar unos minutos para bibliotecas grandes. Por favor, no c
|
|||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:89
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:89
|
||||||
msgid "this month"
|
msgid "this month"
|
||||||
msgstr ""
|
msgstr "este mes"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:31
|
#: apps/native/src/components/dashboard/stats-card.tsx:31
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:135
|
#: apps/web/src/components/dashboard/stats-display.tsx:135
|
||||||
@@ -2121,14 +2153,19 @@ msgid "This page was left on the cutting room floor. It may have been moved, rem
|
|||||||
msgstr "Esta página quedó en la sala de montaje. Puede que haya sido movida, eliminada o que nunca pasara del guion."
|
msgstr "Esta página quedó en la sala de montaje. Puede que haya sido movida, eliminada o que nunca pasara del guion."
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:559
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:559
|
||||||
#: apps/web/src/routes/_app/settings.tsx:112
|
#: apps/web/src/routes/_app/settings.tsx:114
|
||||||
#: apps/web/src/routes/setup.tsx:180
|
#: apps/web/src/routes/setup.tsx:181
|
||||||
msgid "This product uses the TMDB API but is not endorsed or certified by TMDB."
|
msgid "This product uses the TMDB API but is not endorsed or certified by TMDB."
|
||||||
msgstr "Este producto utiliza la API de TMDB pero no está respaldado ni certificado por TMDB."
|
msgstr "Este producto utiliza la API de TMDB pero no está respaldado ni certificado por TMDB."
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:102
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:123
|
||||||
|
msgid "This title will be removed from your library. Your watch history and ratings will be kept."
|
||||||
|
msgstr "Este título será eliminado de tu biblioteca. Tu historial de visualización y calificaciones se conservarán."
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:88
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:88
|
||||||
msgid "this week"
|
msgid "this week"
|
||||||
msgstr ""
|
msgstr "esta semana"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:30
|
#: apps/native/src/components/dashboard/stats-card.tsx:30
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:134
|
#: apps/web/src/components/dashboard/stats-display.tsx:134
|
||||||
@@ -2147,7 +2184,7 @@ msgstr "Esto eliminará todos los títulos parciales sin enriquecer y todas las
|
|||||||
msgid "This will delete un-enriched stub titles that aren't in any user's library and clean up orphaned person records. Deleted titles will be re-imported if accessed again."
|
msgid "This will delete un-enriched stub titles that aren't in any user's library and clean up orphaned person records. Deleted titles will be re-imported if accessed again."
|
||||||
msgstr "Esto eliminará los títulos parciales sin enriquecer que no estén en la biblioteca de ningún usuario y limpiará los registros de personas huérfanas. Los títulos eliminados se reimportarán si se accede a ellos de nuevo."
|
msgstr "Esto eliminará los títulos parciales sin enriquecer que no estén en la biblioteca de ningún usuario y limpiará los registros de personas huérfanas. Los títulos eliminados se reimportarán si se accede a ellos de nuevo."
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:124
|
#: apps/native/src/components/settings/integration-card.tsx:133
|
||||||
msgid "This will invalidate the current {label} URL. You'll need to update it in {label}."
|
msgid "This will invalidate the current {label} URL. You'll need to update it in {label}."
|
||||||
msgstr "Esto invalidará la URL actual de {label}. Tendrás que actualizarla en {label}."
|
msgstr "Esto invalidará la URL actual de {label}. Tendrás que actualizarla en {label}."
|
||||||
|
|
||||||
@@ -2171,7 +2208,7 @@ msgstr "Esto reemplazará toda tu base de datos con el archivo subido. Primero s
|
|||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:90
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:90
|
||||||
msgid "this year"
|
msgid "this year"
|
||||||
msgstr ""
|
msgstr "este año"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:32
|
#: apps/native/src/components/dashboard/stats-card.tsx:32
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:136
|
#: apps/web/src/components/dashboard/stats-display.tsx:136
|
||||||
@@ -2187,7 +2224,7 @@ msgid "Time:"
|
|||||||
msgstr "Hora:"
|
msgstr "Hora:"
|
||||||
|
|
||||||
#: apps/native/src/app/title/[id].tsx:231
|
#: apps/native/src/app/title/[id].tsx:231
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:139
|
#: apps/web/src/routes/_app/titles.$id.tsx:140
|
||||||
msgid "Title not found"
|
msgid "Title not found"
|
||||||
msgstr "Título no encontrado"
|
msgstr "Título no encontrado"
|
||||||
|
|
||||||
@@ -2203,7 +2240,7 @@ msgstr "Los títulos de tu lista de Sofa se añadirán automáticamente para des
|
|||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:87
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:87
|
||||||
msgid "today"
|
msgid "today"
|
||||||
msgstr ""
|
msgstr "hoy"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:29
|
#: apps/native/src/components/dashboard/stats-card.tsx:29
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:133
|
#: apps/web/src/components/dashboard/stats-display.tsx:133
|
||||||
@@ -2236,7 +2273,7 @@ msgid "Trending today"
|
|||||||
msgstr "Tendencia hoy"
|
msgstr "Tendencia hoy"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:77
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:77
|
||||||
#: apps/web/src/routes/_app/explore.tsx:129
|
#: apps/web/src/routes/_app/explore.tsx:131
|
||||||
msgid "Trending Today"
|
msgid "Trending Today"
|
||||||
msgstr "Tendencias hoy"
|
msgstr "Tendencias hoy"
|
||||||
|
|
||||||
@@ -2291,11 +2328,11 @@ msgid "Unwatch all"
|
|||||||
msgstr "Desmarcar todo"
|
msgstr "Desmarcar todo"
|
||||||
|
|
||||||
#. placeholder {0}: season.name ?? t`Season ${season.seasonNumber}`
|
#. placeholder {0}: season.name ?? t`Season ${season.seasonNumber}`
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:313
|
#: apps/web/src/components/titles/use-title-actions.ts:305
|
||||||
msgid "Unwatched all of {0}"
|
msgid "Unwatched all of {0}"
|
||||||
msgstr "Todo de {0} marcado como no visto"
|
msgstr "Todo de {0} marcado como no visto"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:156
|
#: apps/web/src/components/titles/use-title-actions.ts:154
|
||||||
msgid "Unwatched S{seasonNum} E{epNum}"
|
msgid "Unwatched S{seasonNum} E{epNum}"
|
||||||
msgstr "No visto T{seasonNum} E{epNum}"
|
msgstr "No visto T{seasonNum} E{epNum}"
|
||||||
|
|
||||||
@@ -2366,7 +2403,7 @@ msgstr "Subir foto"
|
|||||||
msgid "Upload profile picture"
|
msgid "Upload profile picture"
|
||||||
msgstr "Subir foto de perfil"
|
msgstr "Subir foto de perfil"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:117
|
#: apps/native/src/components/settings/integration-card.tsx:125
|
||||||
msgid "URL copied to clipboard"
|
msgid "URL copied to clipboard"
|
||||||
msgstr "URL copiada al portapapeles"
|
msgstr "URL copiada al portapapeles"
|
||||||
|
|
||||||
@@ -2399,36 +2436,36 @@ msgstr "Historial de visionado"
|
|||||||
msgid "Watch on {name}"
|
msgid "Watch on {name}"
|
||||||
msgstr "Ver en {name}"
|
msgstr "Ver en {name}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:277
|
#: apps/web/src/components/titles/use-title-actions.ts:269
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:286
|
#: apps/web/src/components/titles/use-title-actions.ts:278
|
||||||
msgid "Watched all of {seasonLabel}"
|
msgid "Watched all of {seasonLabel}"
|
||||||
msgstr "Visto todo de {seasonLabel}"
|
msgstr "Visto todo de {seasonLabel}"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:119
|
#: apps/native/src/lib/title-actions.ts:109
|
||||||
msgid "Watched all of {seasonName}"
|
msgid "Watched all of {seasonName}"
|
||||||
msgstr "Visto todo de {seasonName}"
|
msgstr "Visto todo de {seasonName}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:199
|
#: apps/web/src/components/titles/use-title-actions.ts:197
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:208
|
#: apps/web/src/components/titles/use-title-actions.ts:206
|
||||||
msgid "Watched S{seasonNum} E{epNum}"
|
msgid "Watched S{seasonNum} E{epNum}"
|
||||||
msgstr "Visto T{seasonNum} E{epNum}"
|
msgstr "Visto T{seasonNum} E{epNum}"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:43
|
#: apps/native/src/components/titles/status-action-button.tsx:48
|
||||||
#: apps/web/src/components/title-card.tsx:69
|
#: apps/web/src/components/title-card.tsx:69
|
||||||
#: apps/web/src/components/titles/status-button.tsx:14
|
#: apps/web/src/components/titles/status-button.tsx:47
|
||||||
msgid "Watching"
|
msgid "Watching"
|
||||||
msgstr "Viendo"
|
msgstr "Viendo"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:78
|
#: apps/native/src/components/titles/status-action-button.tsx:85
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:743
|
#: apps/web/src/components/settings/imports-section.tsx:743
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:769
|
#: apps/web/src/components/settings/imports-section.tsx:769
|
||||||
#: apps/web/src/components/titles/status-button.tsx:49
|
#: apps/web/src/components/titles/status-button.tsx:82
|
||||||
msgid "Watchlist"
|
msgid "Watchlist"
|
||||||
msgstr "Lista"
|
msgstr "Lista"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:41
|
#: apps/native/src/components/titles/status-action-button.tsx:41
|
||||||
msgid "Watchlisted"
|
#~ msgid "Watchlisted"
|
||||||
msgstr "En lista"
|
#~ msgstr "En lista"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-configs.ts:51
|
#: apps/native/src/components/settings/integration-configs.ts:51
|
||||||
#: apps/native/src/components/settings/integration-configs.ts:66
|
#: apps/native/src/components/settings/integration-configs.ts:66
|
||||||
@@ -2458,7 +2495,7 @@ msgstr "Dónde ver"
|
|||||||
msgid "With Ads"
|
msgid "With Ads"
|
||||||
msgstr "Con anuncios"
|
msgstr "Con anuncios"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:52
|
#: apps/native/src/app/person/[id].tsx:140
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:30
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:30
|
||||||
#: apps/web/src/components/people/person-hero.tsx:73
|
#: apps/web/src/components/people/person-hero.tsx:73
|
||||||
msgid "Writer"
|
msgid "Writer"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
+205
-168
@@ -26,7 +26,7 @@ msgstr "...et {0} de plus"
|
|||||||
#. placeholder {0}: systemHealth.data.imageCache.imageCount
|
#. placeholder {0}: systemHealth.data.imageCache.imageCount
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:438
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:438
|
||||||
msgid "{0, plural, one {# image} other {# images}}"
|
msgid "{0, plural, one {# image} other {# images}}"
|
||||||
msgstr ""
|
msgstr "{0, plural, one {# image} other {# images}}"
|
||||||
|
|
||||||
#. placeholder {0}: systemHealth.data.database.titleCount
|
#. placeholder {0}: systemHealth.data.database.titleCount
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:424
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:424
|
||||||
@@ -104,8 +104,8 @@ msgstr "{0}/{1} {2, plural, one {épisode} other {épisodes}}"
|
|||||||
#~ msgid "{0}/{1} episodes"
|
#~ msgid "{0}/{1} episodes"
|
||||||
#~ msgstr "{0}/{1} episodes"
|
#~ msgstr "{0}/{1} episodes"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:200
|
#: apps/web/src/components/titles/use-title-actions.ts:198
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:278
|
#: apps/web/src/components/titles/use-title-actions.ts:270
|
||||||
msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
|
msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
|
||||||
msgstr "{count} {count, plural, one {épisode précédent non visionné} other {épisodes précédents non visionnés}}"
|
msgstr "{count} {count, plural, one {épisode précédent non visionné} other {épisodes précédents non visionnés}}"
|
||||||
|
|
||||||
@@ -114,22 +114,22 @@ msgstr "{count} {count, plural, one {épisode précédent non visionné} other {
|
|||||||
msgid "{healthyCount} of {0} jobs healthy"
|
msgid "{healthyCount} of {0} jobs healthy"
|
||||||
msgstr "{healthyCount} sur {0} tâches en bonne santé"
|
msgstr "{healthyCount} sur {0} tâches en bonne santé"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:84
|
#: apps/native/src/components/settings/integration-card.tsx:86
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:89
|
#: apps/web/src/components/settings/integration-card.tsx:89
|
||||||
msgid "{label} connected"
|
msgid "{label} connected"
|
||||||
msgstr "{label} connecté"
|
msgstr "{label} connecté"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:94
|
#: apps/native/src/components/settings/integration-card.tsx:96
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:105
|
#: apps/web/src/components/settings/integration-card.tsx:105
|
||||||
msgid "{label} disconnected"
|
msgid "{label} disconnected"
|
||||||
msgstr "{label} déconnecté"
|
msgstr "{label} déconnecté"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:104
|
#: apps/native/src/components/settings/integration-card.tsx:106
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:119
|
#: apps/web/src/components/settings/integration-card.tsx:119
|
||||||
msgid "{label} URL regenerated"
|
msgid "{label} URL regenerated"
|
||||||
msgstr "URL {label} régénérée"
|
msgstr "URL {label} régénérée"
|
||||||
|
|
||||||
#: apps/web/src/components/title-card.tsx:152
|
#: apps/web/src/components/title-card.tsx:157
|
||||||
msgid "{watched}/{total} episodes"
|
msgid "{watched}/{total} episodes"
|
||||||
msgstr "{watched}/{total} épisodes"
|
msgstr "{watched}/{total} épisodes"
|
||||||
|
|
||||||
@@ -155,9 +155,9 @@ msgstr "Compte"
|
|||||||
|
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:378
|
#: apps/web/src/components/settings/system-health-section.tsx:378
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr ""
|
msgstr "Actions"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:50
|
#: apps/native/src/app/person/[id].tsx:138
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:28
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:28
|
||||||
#: apps/web/src/components/people/person-hero.tsx:69
|
#: apps/web/src/components/people/person-hero.tsx:69
|
||||||
msgid "Actor"
|
msgid "Actor"
|
||||||
@@ -180,13 +180,13 @@ msgstr "Ajoutez un nouveau webhook et collez l'URL ci-dessus"
|
|||||||
msgid "Add to Library"
|
msgid "Add to Library"
|
||||||
msgstr "Ajouter à la bibliothèque"
|
msgstr "Ajouter à la bibliothèque"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:73
|
#: apps/native/src/components/titles/status-action-button.tsx:80
|
||||||
msgid "Add to watchlist"
|
msgid "Add to watchlist"
|
||||||
msgstr "Ajouter à la liste de suivi"
|
msgstr "Ajouter à la liste de suivi"
|
||||||
|
|
||||||
#: apps/native/src/components/explore/hero-banner.tsx:132
|
#: apps/native/src/components/explore/hero-banner.tsx:132
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:212
|
#: apps/native/src/components/ui/poster-card.tsx:215
|
||||||
#: apps/web/src/components/title-card.tsx:133
|
#: apps/web/src/components/title-card.tsx:138
|
||||||
msgid "Add to Watchlist"
|
msgid "Add to Watchlist"
|
||||||
msgstr "Ajouter à la liste de suivi"
|
msgstr "Ajouter à la liste de suivi"
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ msgstr "« {titleName} » ajouté à la liste de suivi"
|
|||||||
#: apps/native/src/hooks/use-title-actions.ts:44
|
#: apps/native/src/hooks/use-title-actions.ts:44
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:59
|
#: apps/native/src/hooks/use-title-actions.ts:59
|
||||||
#: apps/native/src/lib/title-actions.ts:25
|
#: apps/native/src/lib/title-actions.ts:25
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:98
|
#: apps/web/src/components/titles/use-title-actions.ts:95
|
||||||
msgid "Added to watchlist"
|
msgid "Added to watchlist"
|
||||||
msgstr "Ajouté à la liste de suivi"
|
msgstr "Ajouté à la liste de suivi"
|
||||||
|
|
||||||
@@ -207,13 +207,13 @@ msgstr "Ajouté à la liste de suivi"
|
|||||||
#: apps/web/src/components/nav-bar.tsx:223
|
#: apps/web/src/components/nav-bar.tsx:223
|
||||||
#: apps/web/src/components/settings/account-section.tsx:309
|
#: apps/web/src/components/settings/account-section.tsx:309
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr ""
|
msgstr "Admin"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:154
|
#: apps/web/src/routes/_app/settings.tsx:156
|
||||||
msgid "Admin only"
|
msgid "Admin only"
|
||||||
msgstr "Admins uniquement"
|
msgstr "Admins uniquement"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:249
|
#: apps/native/src/app/person/[id].tsx:189
|
||||||
#: apps/web/src/components/people/person-hero.tsx:89
|
#: apps/web/src/components/people/person-hero.tsx:89
|
||||||
msgid "age {age}"
|
msgid "age {age}"
|
||||||
msgstr "âge {age}"
|
msgstr "âge {age}"
|
||||||
@@ -243,15 +243,15 @@ msgstr "Une erreur inattendue s'est produite lors du chargement de cette page. V
|
|||||||
msgid "Anonymous usage reporting"
|
msgid "Anonymous usage reporting"
|
||||||
msgstr "Rapports d'utilisation anonymes"
|
msgstr "Rapports d'utilisation anonymes"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:135
|
#: apps/web/src/routes/_app/settings.tsx:137
|
||||||
msgid "App Settings"
|
msgid "App Settings"
|
||||||
msgstr "Paramètres de l'application"
|
msgstr "Paramètres de l'application"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:362
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:362
|
||||||
msgid "Application"
|
msgid "Application"
|
||||||
msgstr ""
|
msgstr "Application"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:139
|
#: apps/native/src/components/settings/integration-card.tsx:148
|
||||||
msgid "Are you sure you want to disconnect {label}? The current URL will stop working."
|
msgid "Are you sure you want to disconnect {label}? The current URL will stop working."
|
||||||
msgstr "Voulez-vous vraiment déconnecter {label} ? L'URL actuelle cessera de fonctionner."
|
msgstr "Voulez-vous vraiment déconnecter {label} ? L'URL actuelle cessera de fonctionner."
|
||||||
|
|
||||||
@@ -310,7 +310,7 @@ msgid "Backup schedule"
|
|||||||
msgstr "Planning de sauvegarde"
|
msgstr "Planning de sauvegarde"
|
||||||
|
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:583
|
#: apps/web/src/components/settings/system-health-section.tsx:583
|
||||||
#: apps/web/src/routes/_app/settings.tsx:190
|
#: apps/web/src/routes/_app/settings.tsx:192
|
||||||
msgid "Backups"
|
msgid "Backups"
|
||||||
msgstr "Sauvegardes"
|
msgstr "Sauvegardes"
|
||||||
|
|
||||||
@@ -337,8 +337,9 @@ msgstr "Impossible de joindre le serveur"
|
|||||||
#: apps/native/src/components/header-avatar.tsx:63
|
#: apps/native/src/components/header-avatar.tsx:63
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:58
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:58
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:32
|
#: apps/native/src/components/search/recently-viewed-list.tsx:32
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:126
|
#: apps/native/src/components/settings/integration-card.tsx:135
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:141
|
#: apps/native/src/components/settings/integration-card.tsx:150
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:104
|
||||||
#: apps/web/src/components/settings/account-section.tsx:477
|
#: apps/web/src/components/settings/account-section.tsx:477
|
||||||
#: apps/web/src/components/settings/backup-restore-section.tsx:101
|
#: apps/web/src/components/settings/backup-restore-section.tsx:101
|
||||||
#: apps/web/src/components/settings/backup-section.tsx:240
|
#: apps/web/src/components/settings/backup-section.tsx:240
|
||||||
@@ -348,6 +349,7 @@ msgstr "Impossible de joindre le serveur"
|
|||||||
#: apps/web/src/components/settings/imports-section.tsx:611
|
#: apps/web/src/components/settings/imports-section.tsx:611
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:674
|
#: apps/web/src/components/settings/imports-section.tsx:674
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:798
|
#: apps/web/src/components/settings/imports-section.tsx:798
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:131
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:127
|
#: apps/web/src/components/titles/title-seasons.tsx:127
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuler"
|
msgstr "Annuler"
|
||||||
@@ -361,14 +363,20 @@ msgstr "Annuler la modification"
|
|||||||
msgid "Cast"
|
msgid "Cast"
|
||||||
msgstr "Distribution"
|
msgstr "Distribution"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:202
|
#: apps/web/src/components/titles/use-title-actions.ts:200
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:280
|
#: apps/web/src/components/titles/use-title-actions.ts:272
|
||||||
msgid "Catch up"
|
msgid "Catch up"
|
||||||
msgstr "Rattraper"
|
msgstr "Rattraper"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:50
|
||||||
|
#: apps/web/src/components/title-card.tsx:74
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:54
|
||||||
|
msgid "Caught Up"
|
||||||
|
msgstr "À jour"
|
||||||
|
|
||||||
#. placeholder {0}: episodeIds.length
|
#. placeholder {0}: episodeIds.length
|
||||||
#. placeholder {1}: episodeIds.length
|
#. placeholder {1}: episodeIds.length
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:72
|
#: apps/web/src/components/titles/use-title-actions.ts:69
|
||||||
msgid "Caught up — marked {0} {1, plural, one {episode} other {episodes}} as watched"
|
msgid "Caught up — marked {0} {1, plural, one {episode} other {episodes}} as watched"
|
||||||
msgstr "Rattrapé — {0} {1, plural, one {épisode marqué comme visionné} other {épisodes marqués comme visionnés}}"
|
msgstr "Rattrapé — {0} {1, plural, one {épisode marqué comme visionné} other {épisodes marqués comme visionnés}}"
|
||||||
|
|
||||||
@@ -418,7 +426,7 @@ msgstr "Choisissez comment importer vos données {0}."
|
|||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:60
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:60
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:104
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:104
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:34
|
#: apps/native/src/components/search/recently-viewed-list.tsx:34
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:86
|
#: apps/native/src/components/search/recently-viewed-list.tsx:68
|
||||||
msgid "Clear"
|
msgid "Clear"
|
||||||
msgstr "Effacer"
|
msgstr "Effacer"
|
||||||
|
|
||||||
@@ -455,10 +463,10 @@ msgid "Close"
|
|||||||
msgstr "Fermer"
|
msgstr "Fermer"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:146
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:146
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:45
|
#: apps/native/src/components/titles/status-action-button.tsx:52
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:219
|
#: apps/web/src/components/dashboard/stats-display.tsx:219
|
||||||
#: apps/web/src/components/title-card.tsx:74
|
#: apps/web/src/components/title-card.tsx:79
|
||||||
#: apps/web/src/components/titles/status-button.tsx:25
|
#: apps/web/src/components/titles/status-button.tsx:59
|
||||||
msgid "Completed"
|
msgid "Completed"
|
||||||
msgstr "Terminé"
|
msgstr "Terminé"
|
||||||
|
|
||||||
@@ -477,7 +485,7 @@ msgstr "Connecter"
|
|||||||
msgid "Connect {0}"
|
msgid "Connect {0}"
|
||||||
msgstr "Connecter {0}"
|
msgstr "Connecter {0}"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:207
|
#: apps/native/src/components/settings/integration-card.tsx:216
|
||||||
msgid "Connect {label}"
|
msgid "Connect {label}"
|
||||||
msgstr "Connecter {label}"
|
msgstr "Connecter {label}"
|
||||||
|
|
||||||
@@ -485,7 +493,7 @@ msgstr "Connecter {label}"
|
|||||||
msgid "Connect to {source}"
|
msgid "Connect to {source}"
|
||||||
msgstr "Se connecter à {source}"
|
msgstr "Se connecter à {source}"
|
||||||
|
|
||||||
#: apps/web/src/routes/setup.tsx:98
|
#: apps/web/src/routes/setup.tsx:99
|
||||||
msgid "Connect to TMDB"
|
msgid "Connect to TMDB"
|
||||||
msgstr "Se connecter à TMDB"
|
msgstr "Se connecter à TMDB"
|
||||||
|
|
||||||
@@ -516,7 +524,7 @@ msgstr "Connexion au serveur..."
|
|||||||
msgid "Connecting..."
|
msgid "Connecting..."
|
||||||
msgstr "Connexion..."
|
msgstr "Connexion..."
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:207
|
#: apps/native/src/components/settings/integration-card.tsx:216
|
||||||
msgid "Connecting…"
|
msgid "Connecting…"
|
||||||
msgstr "Connexion…"
|
msgstr "Connexion…"
|
||||||
|
|
||||||
@@ -545,7 +553,7 @@ msgstr "Copier l'URL"
|
|||||||
msgid "Could not load integrations"
|
msgid "Could not load integrations"
|
||||||
msgstr "Impossible de charger les intégrations"
|
msgstr "Impossible de charger les intégrations"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:172
|
#: apps/native/src/app/person/[id].tsx:257
|
||||||
msgid "Could not load person details"
|
msgid "Could not load person details"
|
||||||
msgstr "Impossible de charger les détails de la personne"
|
msgstr "Impossible de charger les détails de la personne"
|
||||||
|
|
||||||
@@ -579,14 +587,14 @@ msgstr "Mot de passe actuel"
|
|||||||
msgid "Current password is required"
|
msgid "Current password is required"
|
||||||
msgstr "Le mot de passe actuel est requis"
|
msgstr "Le mot de passe actuel est requis"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:216
|
#: apps/web/src/routes/_app/settings.tsx:218
|
||||||
msgid "Danger Zone"
|
msgid "Danger Zone"
|
||||||
msgstr "Zone de danger"
|
msgstr "Zone de danger"
|
||||||
|
|
||||||
#: apps/web/src/routes/__root.tsx:163
|
#: apps/web/src/routes/__root.tsx:163
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:76
|
#: apps/web/src/routes/_app/people.$id.tsx:78
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:119
|
#: apps/web/src/routes/_app/titles.$id.tsx:120
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:165
|
#: apps/web/src/routes/_app/titles.$id.tsx:166
|
||||||
msgid "Dashboard"
|
msgid "Dashboard"
|
||||||
msgstr "Tableau de bord"
|
msgstr "Tableau de bord"
|
||||||
|
|
||||||
@@ -630,12 +638,12 @@ msgstr "{0, plural, one {# fichier supprimé} other {# fichiers supprimés}}, {f
|
|||||||
msgid "Device code expired. Please try again."
|
msgid "Device code expired. Please try again."
|
||||||
msgstr "Le code d'appareil a expiré. Veuillez réessayer."
|
msgstr "Le code d'appareil a expiré. Veuillez réessayer."
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:249
|
#: apps/native/src/app/person/[id].tsx:189
|
||||||
#: apps/web/src/components/people/person-hero.tsx:89
|
#: apps/web/src/components/people/person-hero.tsx:89
|
||||||
msgid "died at {age}"
|
msgid "died at {age}"
|
||||||
msgstr "décédé à {age} ans"
|
msgstr "décédé à {age} ans"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:51
|
#: apps/native/src/app/person/[id].tsx:139
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:29
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:29
|
||||||
#: apps/web/src/components/people/person-hero.tsx:71
|
#: apps/web/src/components/people/person-hero.tsx:71
|
||||||
msgid "Director"
|
msgid "Director"
|
||||||
@@ -646,13 +654,13 @@ msgstr "Réalisateur"
|
|||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "Désactivé"
|
msgstr "Désactivé"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:143
|
#: apps/native/src/components/settings/integration-card.tsx:152
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:257
|
#: apps/native/src/components/settings/integration-card.tsx:266
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:234
|
#: apps/web/src/components/settings/integration-card.tsx:234
|
||||||
msgid "Disconnect"
|
msgid "Disconnect"
|
||||||
msgstr "Déconnecter"
|
msgstr "Déconnecter"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:138
|
#: apps/native/src/components/settings/integration-card.tsx:147
|
||||||
msgid "Disconnect {label}"
|
msgid "Disconnect {label}"
|
||||||
msgstr "Déconnecter {label}"
|
msgstr "Déconnecter {label}"
|
||||||
|
|
||||||
@@ -685,7 +693,7 @@ msgstr "Télécharger"
|
|||||||
msgid "Download backup"
|
msgid "Download backup"
|
||||||
msgstr "Télécharger la sauvegarde"
|
msgstr "Télécharger la sauvegarde"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:54
|
#: apps/native/src/app/person/[id].tsx:142
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:32
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:32
|
||||||
#: apps/web/src/components/people/person-hero.tsx:77
|
#: apps/web/src/components/people/person-hero.tsx:77
|
||||||
msgid "Editor"
|
msgid "Editor"
|
||||||
@@ -729,24 +737,31 @@ msgstr "Entrez l'URL de votre serveur Sofa pour commencer"
|
|||||||
msgid "Environment"
|
msgid "Environment"
|
||||||
msgstr "Environnement"
|
msgstr "Environnement"
|
||||||
|
|
||||||
#. placeholder {0}: episode.episodeNumber
|
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:27
|
#: apps/native/src/components/titles/episode-row.tsx:27
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:48
|
#: apps/native/src/components/titles/episode-row.tsx:48
|
||||||
msgid "Episode {0}"
|
#~ msgid "Episode {0}"
|
||||||
msgstr "Épisode {0}"
|
#~ msgstr "Épisode {0}"
|
||||||
|
|
||||||
#. placeholder {0}: episode.episodeNumber
|
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:34
|
#: apps/native/src/components/titles/episode-row.tsx:34
|
||||||
msgid "Episode {0}, {episodeLabel}"
|
#~ msgid "Episode {0}, {episodeLabel}"
|
||||||
msgstr "Épisode {0}, {episodeLabel}"
|
#~ msgstr "Épisode {0}, {episodeLabel}"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:111
|
#: apps/native/src/components/titles/episode-row.tsx:29
|
||||||
#: apps/native/src/lib/title-actions.ts:108
|
#: apps/native/src/components/titles/episode-row.tsx:52
|
||||||
|
msgid "Episode {episodeNumber}"
|
||||||
|
msgstr "Épisode {episodeNumber}"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/episode-row.tsx:38
|
||||||
|
msgid "Episode {episodeNumber}, {episodeLabel}"
|
||||||
|
msgstr "Épisode {episodeNumber}, {episodeLabel}"
|
||||||
|
|
||||||
|
#: apps/native/src/hooks/use-title-actions.ts:109
|
||||||
|
#: apps/native/src/lib/title-actions.ts:84
|
||||||
msgid "Episode unwatched"
|
msgid "Episode unwatched"
|
||||||
msgstr "Épisode non visionné"
|
msgstr "Épisode non visionné"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:101
|
#: apps/native/src/hooks/use-title-actions.ts:99
|
||||||
#: apps/native/src/lib/title-actions.ts:98
|
#: apps/native/src/lib/title-actions.ts:74
|
||||||
msgid "Episode watched"
|
msgid "Episode watched"
|
||||||
msgstr "Épisode visionné"
|
msgstr "Épisode visionné"
|
||||||
|
|
||||||
@@ -758,7 +773,7 @@ msgstr "Épisodes"
|
|||||||
#. placeholder {0}: periodLabels[episodePeriod]
|
#. placeholder {0}: periodLabels[episodePeriod]
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:125
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:125
|
||||||
msgid "Episodes {0}"
|
msgid "Episodes {0}"
|
||||||
msgstr ""
|
msgstr "Épisodes {0}"
|
||||||
|
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:162
|
#: apps/web/src/components/dashboard/stats-display.tsx:162
|
||||||
#~ msgid "Episodes {periodSelect}"
|
#~ msgid "Episodes {periodSelect}"
|
||||||
@@ -790,8 +805,8 @@ msgstr "Erreurs ({0})"
|
|||||||
msgid "Explore"
|
msgid "Explore"
|
||||||
msgstr "Explorer"
|
msgstr "Explorer"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:68
|
#: apps/web/src/routes/_app/people.$id.tsx:70
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:157
|
#: apps/web/src/routes/_app/titles.$id.tsx:158
|
||||||
msgid "Explore titles"
|
msgid "Explore titles"
|
||||||
msgstr "Explorer les titres"
|
msgstr "Explorer les titres"
|
||||||
|
|
||||||
@@ -804,7 +819,7 @@ msgstr "Échoué"
|
|||||||
msgid "Failed to add to watchlist"
|
msgid "Failed to add to watchlist"
|
||||||
msgstr "Échec de l'ajout à la liste de suivi"
|
msgstr "Échec de l'ajout à la liste de suivi"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:80
|
#: apps/web/src/components/titles/use-title-actions.ts:77
|
||||||
msgid "Failed to catch up"
|
msgid "Failed to catch up"
|
||||||
msgstr "Échec du rattrapage"
|
msgstr "Échec du rattrapage"
|
||||||
|
|
||||||
@@ -817,7 +832,7 @@ msgstr "Échec du changement de mot de passe"
|
|||||||
msgid "Failed to connect"
|
msgid "Failed to connect"
|
||||||
msgstr "Échec de la connexion"
|
msgstr "Échec de la connexion"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:87
|
#: apps/native/src/components/settings/integration-card.tsx:89
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:91
|
#: apps/web/src/components/settings/integration-card.tsx:91
|
||||||
msgid "Failed to connect {label}"
|
msgid "Failed to connect {label}"
|
||||||
msgstr "Échec de la connexion à {label}"
|
msgstr "Échec de la connexion à {label}"
|
||||||
@@ -834,7 +849,7 @@ msgstr "Échec de la création de la sauvegarde"
|
|||||||
msgid "Failed to delete backup"
|
msgid "Failed to delete backup"
|
||||||
msgstr "Échec de la suppression de la sauvegarde"
|
msgstr "Échec de la suppression de la sauvegarde"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:97
|
#: apps/native/src/components/settings/integration-card.tsx:99
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:108
|
#: apps/web/src/components/settings/integration-card.tsx:108
|
||||||
msgid "Failed to disconnect {label}"
|
msgid "Failed to disconnect {label}"
|
||||||
msgstr "Échec de la déconnexion de {label}"
|
msgstr "Échec de la déconnexion de {label}"
|
||||||
@@ -843,29 +858,30 @@ msgstr "Échec de la déconnexion de {label}"
|
|||||||
msgid "Failed to load backup schedule settings."
|
msgid "Failed to load backup schedule settings."
|
||||||
msgstr "Échec du chargement des paramètres de planning de sauvegarde."
|
msgstr "Échec du chargement des paramètres de planning de sauvegarde."
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:110
|
#: apps/web/src/routes/_app/titles.$id.tsx:111
|
||||||
msgid "Failed to load title"
|
msgid "Failed to load title"
|
||||||
msgstr "Échec du chargement du titre"
|
msgstr "Échec du chargement du titre"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:344
|
#: apps/native/src/lib/title-actions.ts:101
|
||||||
|
#: apps/web/src/components/titles/use-title-actions.ts:338
|
||||||
msgid "Failed to mark all episodes as watched"
|
msgid "Failed to mark all episodes as watched"
|
||||||
msgstr "Échec du marquage de tous les épisodes comme visionnés"
|
msgstr "Échec du marquage de tous les épisodes comme visionnés"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:79
|
#: apps/native/src/hooks/use-title-actions.ts:77
|
||||||
#: apps/native/src/lib/title-actions.ts:67
|
#: apps/native/src/lib/title-actions.ts:43
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:137
|
#: apps/web/src/components/titles/use-title-actions.ts:134
|
||||||
msgid "Failed to mark as watched"
|
msgid "Failed to mark as watched"
|
||||||
msgstr "Échec du marquage comme visionné"
|
msgstr "Échec du marquage comme visionné"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:104
|
#: apps/native/src/hooks/use-title-actions.ts:102
|
||||||
#: apps/native/src/lib/title-actions.ts:101
|
#: apps/native/src/lib/title-actions.ts:77
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:216
|
#: apps/web/src/components/titles/use-title-actions.ts:214
|
||||||
msgid "Failed to mark episode"
|
msgid "Failed to mark episode"
|
||||||
msgstr "Échec du marquage de l'épisode"
|
msgstr "Échec du marquage de l'épisode"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:124
|
#: apps/native/src/hooks/use-title-actions.ts:122
|
||||||
#: apps/native/src/lib/title-actions.ts:123
|
#: apps/native/src/lib/title-actions.ts:113
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:294
|
#: apps/web/src/components/titles/use-title-actions.ts:286
|
||||||
msgid "Failed to mark some episodes"
|
msgid "Failed to mark some episodes"
|
||||||
msgstr "Échec du marquage de certains épisodes"
|
msgstr "Échec du marquage de certains épisodes"
|
||||||
|
|
||||||
@@ -889,12 +905,12 @@ msgstr "Échec de la purge du cache d'images"
|
|||||||
msgid "Failed to purge metadata cache"
|
msgid "Failed to purge metadata cache"
|
||||||
msgstr "Échec de la purge du cache de métadonnées"
|
msgstr "Échec de la purge du cache de métadonnées"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:107
|
#: apps/native/src/components/settings/integration-card.tsx:109
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:121
|
#: apps/web/src/components/settings/integration-card.tsx:121
|
||||||
msgid "Failed to regenerate {label} URL"
|
msgid "Failed to regenerate {label} URL"
|
||||||
msgstr "Échec de la régénération de l'URL {label}"
|
msgstr "Échec de la régénération de l'URL {label}"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:77
|
#: apps/native/src/lib/title-actions.ts:53
|
||||||
msgid "Failed to remove from library"
|
msgid "Failed to remove from library"
|
||||||
msgstr "Échec de la suppression de la bibliothèque"
|
msgstr "Échec de la suppression de la bibliothèque"
|
||||||
|
|
||||||
@@ -916,13 +932,13 @@ msgstr "Échec du démarrage de la connexion {0}"
|
|||||||
msgid "Failed to trigger job"
|
msgid "Failed to trigger job"
|
||||||
msgstr "Échec du déclenchement de la tâche"
|
msgstr "Échec du déclenchement de la tâche"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:114
|
#: apps/native/src/hooks/use-title-actions.ts:112
|
||||||
#: apps/native/src/lib/title-actions.ts:111
|
#: apps/native/src/lib/title-actions.ts:87
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:163
|
#: apps/web/src/components/titles/use-title-actions.ts:161
|
||||||
msgid "Failed to unmark episode"
|
msgid "Failed to unmark episode"
|
||||||
msgstr "Échec du démarquage de l'épisode"
|
msgstr "Échec du démarquage de l'épisode"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:320
|
#: apps/web/src/components/titles/use-title-actions.ts:312
|
||||||
msgid "Failed to unmark some episodes"
|
msgid "Failed to unmark some episodes"
|
||||||
msgstr "Échec du démarquage de certains épisodes"
|
msgstr "Échec du démarquage de certains épisodes"
|
||||||
|
|
||||||
@@ -930,9 +946,9 @@ msgstr "Échec du démarquage de certains épisodes"
|
|||||||
msgid "Failed to update name"
|
msgid "Failed to update name"
|
||||||
msgstr "Échec de la mise à jour du nom"
|
msgstr "Échec de la mise à jour du nom"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:94
|
#: apps/native/src/hooks/use-title-actions.ts:92
|
||||||
#: apps/native/src/lib/title-actions.ts:91
|
#: apps/native/src/lib/title-actions.ts:67
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:123
|
#: apps/web/src/components/titles/use-title-actions.ts:120
|
||||||
msgid "Failed to update rating"
|
msgid "Failed to update rating"
|
||||||
msgstr "Échec de la mise à jour de la note"
|
msgstr "Échec de la mise à jour de la note"
|
||||||
|
|
||||||
@@ -958,10 +974,8 @@ msgstr "Échec de la mise à jour du paramètre de sauvegarde planifiée"
|
|||||||
msgid "Failed to update setting"
|
msgid "Failed to update setting"
|
||||||
msgstr "Échec de la mise à jour du paramètre"
|
msgstr "Échec de la mise à jour du paramètre"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:69
|
#: apps/native/src/hooks/use-title-actions.ts:67
|
||||||
#: apps/native/src/lib/title-actions.ts:41
|
#: apps/web/src/components/titles/use-title-actions.ts:98
|
||||||
#: apps/native/src/lib/title-actions.ts:55
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:101
|
|
||||||
msgid "Failed to update status"
|
msgid "Failed to update status"
|
||||||
msgstr "Échec de la mise à jour du statut"
|
msgstr "Échec de la mise à jour du statut"
|
||||||
|
|
||||||
@@ -973,7 +987,7 @@ msgstr "Échec du téléchargement de l'avatar"
|
|||||||
msgid "Fetching your library data from {source}..."
|
msgid "Fetching your library data from {source}..."
|
||||||
msgstr "Récupération de vos données depuis {source}..."
|
msgstr "Récupération de vos données depuis {source}..."
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:279
|
#: apps/native/src/app/person/[id].tsx:219
|
||||||
#: apps/web/src/components/people/filmography-grid.tsx:67
|
#: apps/web/src/components/people/filmography-grid.tsx:67
|
||||||
msgid "Filmography"
|
msgid "Filmography"
|
||||||
msgstr "Filmographie"
|
msgstr "Filmographie"
|
||||||
@@ -1002,8 +1016,8 @@ msgstr "Vendredi"
|
|||||||
msgid "Get Started"
|
msgid "Get Started"
|
||||||
msgstr "Commencer"
|
msgstr "Commencer"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:176
|
#: apps/native/src/app/person/[id].tsx:261
|
||||||
#: apps/native/src/app/person/[id].tsx:196
|
#: apps/native/src/app/person/[id].tsx:281
|
||||||
#: apps/native/src/app/title/[id].tsx:235
|
#: apps/native/src/app/title/[id].tsx:235
|
||||||
msgid "Go back"
|
msgid "Go back"
|
||||||
msgstr "Retour"
|
msgstr "Retour"
|
||||||
@@ -1112,6 +1126,11 @@ msgstr "Dans la bibliothèque"
|
|||||||
msgid "In Library"
|
msgid "In Library"
|
||||||
msgstr "Dans la bibliothèque"
|
msgstr "Dans la bibliothèque"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:46
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:40
|
||||||
|
msgid "In Watchlist"
|
||||||
|
msgstr "Dans la liste"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:179
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:179
|
||||||
#: apps/web/src/components/dashboard/library-section.tsx:35
|
#: apps/web/src/components/dashboard/library-section.tsx:35
|
||||||
msgid "In Your Library"
|
msgid "In Your Library"
|
||||||
@@ -1222,22 +1241,23 @@ msgid "Mark all episodes as watched?"
|
|||||||
msgstr "Marquer tous les épisodes comme visionnés ?"
|
msgstr "Marquer tous les épisodes comme visionnés ?"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:152
|
#: apps/native/src/components/titles/season-accordion.tsx:152
|
||||||
|
#: apps/native/src/components/ui/poster-card.tsx:229
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:109
|
#: apps/web/src/components/titles/title-seasons.tsx:109
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:135
|
#: apps/web/src/components/titles/title-seasons.tsx:135
|
||||||
msgid "Mark All Watched"
|
msgid "Mark All Watched"
|
||||||
msgstr "Tout marquer comme visionné"
|
msgstr "Tout marquer comme visionné"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/continue-watching-card.tsx:103
|
#: apps/native/src/components/dashboard/continue-watching-card.tsx:103
|
||||||
msgid "Mark as Completed"
|
#~ msgid "Mark as Completed"
|
||||||
msgstr "Marquer comme terminé"
|
#~ msgstr "Marquer comme terminé"
|
||||||
|
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:226
|
#: apps/native/src/components/ui/poster-card.tsx:222
|
||||||
msgid "Mark as Watched"
|
msgid "Mark as Watched"
|
||||||
msgstr "Marquer comme visionné"
|
msgstr "Marquer comme visionné"
|
||||||
|
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:219
|
#: apps/native/src/components/ui/poster-card.tsx:219
|
||||||
msgid "Mark as Watching"
|
#~ msgid "Mark as Watching"
|
||||||
msgstr "Marquer comme en cours"
|
#~ msgstr "Marquer comme en cours"
|
||||||
|
|
||||||
#: apps/native/src/app/title/[id].tsx:400
|
#: apps/native/src/app/title/[id].tsx:400
|
||||||
#: apps/web/src/components/titles/title-actions.tsx:27
|
#: apps/web/src/components/titles/title-actions.tsx:27
|
||||||
@@ -1245,32 +1265,37 @@ msgid "Mark Watched"
|
|||||||
msgstr "Marquer comme visionné"
|
msgstr "Marquer comme visionné"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:50
|
#: apps/native/src/lib/title-actions.ts:50
|
||||||
msgid "Marked \"{titleName}\" as completed"
|
#~ msgid "Marked \"{titleName}\" as completed"
|
||||||
msgstr "« {titleName} » marqué comme terminé"
|
#~ msgstr "« {titleName} » marqué comme terminé"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:63
|
#: apps/native/src/lib/title-actions.ts:39
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:134
|
#: apps/web/src/components/titles/use-title-actions.ts:131
|
||||||
msgid "Marked \"{titleName}\" as watched"
|
msgid "Marked \"{titleName}\" as watched"
|
||||||
msgstr "« {titleName} » marqué comme visionné"
|
msgstr "« {titleName} » marqué comme visionné"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:337
|
#: apps/native/src/lib/title-actions.ts:97
|
||||||
|
#: apps/web/src/components/titles/use-title-actions.ts:331
|
||||||
msgid "Marked all episodes as watched"
|
msgid "Marked all episodes as watched"
|
||||||
msgstr "Tous les épisodes marqués comme visionnés"
|
msgstr "Tous les épisodes marqués comme visionnés"
|
||||||
|
|
||||||
|
#: apps/native/src/lib/title-actions.ts:96
|
||||||
|
msgid "Marked all episodes of \"{titleName}\" as watched"
|
||||||
|
msgstr "Tous les épisodes de \"{titleName}\" marqués comme vus"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:61
|
#: apps/native/src/hooks/use-title-actions.ts:61
|
||||||
#: apps/native/src/lib/title-actions.ts:51
|
#: apps/native/src/lib/title-actions.ts:51
|
||||||
msgid "Marked as completed"
|
#~ msgid "Marked as completed"
|
||||||
msgstr "Marqué comme terminé"
|
#~ msgstr "Marqué comme terminé"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:76
|
#: apps/native/src/hooks/use-title-actions.ts:74
|
||||||
#: apps/native/src/lib/title-actions.ts:63
|
#: apps/native/src/lib/title-actions.ts:39
|
||||||
msgid "Marked as watched"
|
msgid "Marked as watched"
|
||||||
msgstr "Marqué comme visionné"
|
msgstr "Marqué comme visionné"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:60
|
#: apps/native/src/hooks/use-title-actions.ts:60
|
||||||
#: apps/native/src/lib/title-actions.ts:38
|
#: apps/native/src/lib/title-actions.ts:38
|
||||||
msgid "Marked as watching"
|
#~ msgid "Marked as watching"
|
||||||
msgstr "Marqué comme en cours"
|
#~ msgstr "Marqué comme en cours"
|
||||||
|
|
||||||
#: apps/web/src/components/settings/account-section.tsx:314
|
#: apps/web/src/components/settings/account-section.tsx:314
|
||||||
msgid "Member since {memberSince}"
|
msgid "Member since {memberSince}"
|
||||||
@@ -1305,7 +1330,7 @@ msgstr "Films"
|
|||||||
#. placeholder {0}: periodLabels[moviePeriod]
|
#. placeholder {0}: periodLabels[moviePeriod]
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:114
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:114
|
||||||
msgid "Movies {0}"
|
msgid "Movies {0}"
|
||||||
msgstr ""
|
msgstr "Films {0}"
|
||||||
|
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:161
|
#: apps/web/src/components/dashboard/stats-display.tsx:161
|
||||||
#~ msgid "Movies {periodSelect}"
|
#~ msgid "Movies {periodSelect}"
|
||||||
@@ -1345,7 +1370,7 @@ msgstr "Jamais exécuté"
|
|||||||
msgid "New account creation is currently disabled."
|
msgid "New account creation is currently disabled."
|
||||||
msgstr "La création de nouveaux comptes est actuellement désactivée."
|
msgstr "La création de nouveaux comptes est actuellement désactivée."
|
||||||
|
|
||||||
#: apps/web/src/routes/_auth/register.tsx:36
|
#: apps/web/src/routes/_auth/register.tsx:33
|
||||||
msgid "New accounts are not being accepted right now. Contact the admin if you need access."
|
msgid "New accounts are not being accepted right now. Contact the admin if you need access."
|
||||||
msgstr "Les nouvelles inscriptions sont fermées. Contactez l'administrateur si vous avez besoin d'un accès."
|
msgstr "Les nouvelles inscriptions sont fermées. Contactez l'administrateur si vous avez besoin d'un accès."
|
||||||
|
|
||||||
@@ -1403,7 +1428,7 @@ msgstr "Aucun résultat trouvé."
|
|||||||
msgid "No titles found for this genre."
|
msgid "No titles found for this genre."
|
||||||
msgstr "Aucun titre trouvé pour ce genre."
|
msgstr "Aucun titre trouvé pour ce genre."
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:174
|
#: apps/native/src/components/settings/integration-card.tsx:183
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:153
|
#: apps/web/src/components/settings/integration-card.tsx:153
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:229
|
#: apps/web/src/components/settings/system-health-section.tsx:229
|
||||||
msgid "Not configured"
|
msgid "Not configured"
|
||||||
@@ -1517,8 +1542,8 @@ msgstr "Vérifier périodiquement GitHub pour les nouvelles versions de Sofa"
|
|||||||
msgid "Person"
|
msgid "Person"
|
||||||
msgstr "Personne"
|
msgstr "Personne"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:192
|
#: apps/native/src/app/person/[id].tsx:277
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:50
|
#: apps/web/src/routes/_app/people.$id.tsx:52
|
||||||
msgid "Person not found"
|
msgid "Person not found"
|
||||||
msgstr "Personne introuvable"
|
msgstr "Personne introuvable"
|
||||||
|
|
||||||
@@ -1527,12 +1552,12 @@ msgid "Play trailer"
|
|||||||
msgstr "Lire la bande-annonce"
|
msgstr "Lire la bande-annonce"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:89
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:89
|
||||||
#: apps/web/src/routes/_app/explore.tsx:141
|
#: apps/web/src/routes/_app/explore.tsx:143
|
||||||
msgid "Popular Movies"
|
msgid "Popular Movies"
|
||||||
msgstr "Films populaires"
|
msgstr "Films populaires"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:102
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:102
|
||||||
#: apps/web/src/routes/_app/explore.tsx:151
|
#: apps/web/src/routes/_app/explore.tsx:153
|
||||||
msgid "Popular TV Shows"
|
msgid "Popular TV Shows"
|
||||||
msgstr "Séries populaires"
|
msgstr "Séries populaires"
|
||||||
|
|
||||||
@@ -1540,7 +1565,7 @@ msgstr "Séries populaires"
|
|||||||
msgid "Pre-restore backup"
|
msgid "Pre-restore backup"
|
||||||
msgstr "Sauvegarde pré-restauration"
|
msgstr "Sauvegarde pré-restauration"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:53
|
#: apps/native/src/app/person/[id].tsx:141
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:31
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:31
|
||||||
#: apps/web/src/components/people/person-hero.tsx:75
|
#: apps/web/src/components/people/person-hero.tsx:75
|
||||||
msgid "Producer"
|
msgid "Producer"
|
||||||
@@ -1612,7 +1637,7 @@ msgstr "URL de liste Radarr"
|
|||||||
|
|
||||||
#. placeholder {0}: input.stars
|
#. placeholder {0}: input.stars
|
||||||
#. placeholder {1}: input.stars
|
#. placeholder {1}: input.stars
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:88
|
#: apps/native/src/hooks/use-title-actions.ts:86
|
||||||
msgid "Rated {0} {1, plural, one {star} other {stars}}"
|
msgid "Rated {0} {1, plural, one {star} other {stars}}"
|
||||||
msgstr "Noté {0} {1, plural, one {étoile} other {étoiles}}"
|
msgstr "Noté {0} {1, plural, one {étoile} other {étoiles}}"
|
||||||
|
|
||||||
@@ -1620,11 +1645,11 @@ msgstr "Noté {0} {1, plural, one {étoile} other {étoiles}}"
|
|||||||
#~ msgid "Rated {0} star{1}"
|
#~ msgid "Rated {0} star{1}"
|
||||||
#~ msgstr "Rated {0} star{1}"
|
#~ msgstr "Rated {0} star{1}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:118
|
#: apps/web/src/components/titles/use-title-actions.ts:115
|
||||||
msgid "Rated {ratingStars} {ratingStars, plural, one {star} other {stars}}"
|
msgid "Rated {ratingStars} {ratingStars, plural, one {star} other {stars}}"
|
||||||
msgstr "Noté {ratingStars} {ratingStars, plural, one {étoile} other {étoiles}}"
|
msgstr "Noté {ratingStars} {ratingStars, plural, one {étoile} other {étoiles}}"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:86
|
#: apps/native/src/lib/title-actions.ts:62
|
||||||
msgid "Rated {stars, plural, one {# star} other {# stars}}"
|
msgid "Rated {stars, plural, one {# star} other {# stars}}"
|
||||||
msgstr "Noté {stars, plural, one {# étoile} other {# étoiles}}"
|
msgstr "Noté {stars, plural, one {# étoile} other {# étoiles}}"
|
||||||
|
|
||||||
@@ -1633,9 +1658,9 @@ msgstr "Noté {stars, plural, one {# étoile} other {# étoiles}}"
|
|||||||
msgid "Rating"
|
msgid "Rating"
|
||||||
msgstr "Note"
|
msgstr "Note"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:89
|
#: apps/native/src/hooks/use-title-actions.ts:87
|
||||||
#: apps/native/src/lib/title-actions.ts:87
|
#: apps/native/src/lib/title-actions.ts:63
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:119
|
#: apps/web/src/components/titles/use-title-actions.ts:116
|
||||||
msgid "Rating removed"
|
msgid "Rating removed"
|
||||||
msgstr "Note supprimée"
|
msgstr "Note supprimée"
|
||||||
|
|
||||||
@@ -1663,7 +1688,7 @@ msgid "Recent Searches"
|
|||||||
msgstr "Recherches récentes"
|
msgstr "Recherches récentes"
|
||||||
|
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:95
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:95
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:77
|
#: apps/native/src/components/search/recently-viewed-list.tsx:59
|
||||||
msgid "Recently Viewed"
|
msgid "Recently Viewed"
|
||||||
msgstr "Récemment consultés"
|
msgstr "Récemment consultés"
|
||||||
|
|
||||||
@@ -1692,12 +1717,12 @@ msgstr "Actualiser"
|
|||||||
msgid "Refresh system health"
|
msgid "Refresh system health"
|
||||||
msgstr "Actualiser l'état du système"
|
msgstr "Actualiser l'état du système"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:128
|
#: apps/native/src/components/settings/integration-card.tsx:137
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:248
|
#: apps/native/src/components/settings/integration-card.tsx:257
|
||||||
msgid "Regenerate"
|
msgid "Regenerate"
|
||||||
msgstr "Régénérer"
|
msgstr "Régénérer"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:123
|
#: apps/native/src/components/settings/integration-card.tsx:132
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:226
|
#: apps/web/src/components/settings/integration-card.tsx:226
|
||||||
msgid "Regenerate URL"
|
msgid "Regenerate URL"
|
||||||
msgstr "Régénérer l'URL"
|
msgstr "Régénérer l'URL"
|
||||||
@@ -1717,7 +1742,7 @@ msgid "Registration closed"
|
|||||||
msgstr "Inscriptions fermées"
|
msgstr "Inscriptions fermées"
|
||||||
|
|
||||||
#: apps/native/src/app/(auth)/register.tsx:87
|
#: apps/native/src/app/(auth)/register.tsx:87
|
||||||
#: apps/web/src/routes/_auth/register.tsx:33
|
#: apps/web/src/routes/_auth/register.tsx:30
|
||||||
msgid "Registration Closed"
|
msgid "Registration Closed"
|
||||||
msgstr "Inscriptions fermées"
|
msgstr "Inscriptions fermées"
|
||||||
|
|
||||||
@@ -1726,20 +1751,27 @@ msgstr "Inscriptions fermées"
|
|||||||
msgid "Registration opened"
|
msgid "Registration opened"
|
||||||
msgstr "Inscriptions ouvertes"
|
msgstr "Inscriptions ouvertes"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/status-button.tsx:76
|
#: apps/native/src/components/titles/status-action-button.tsx:106
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:109
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:139
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Supprimer"
|
msgstr "Supprimer"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:96
|
#: apps/native/src/components/titles/status-action-button.tsx:115
|
||||||
#: apps/web/src/components/titles/status-button.tsx:60
|
#: apps/web/src/components/titles/status-button.tsx:93
|
||||||
msgid "Remove from library"
|
msgid "Remove from library"
|
||||||
msgstr "Supprimer de la bibliothèque"
|
msgstr "Supprimer de la bibliothèque"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/continue-watching-card.tsx:108
|
#: apps/native/src/components/dashboard/continue-watching-card.tsx:108
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:233
|
#: apps/native/src/components/ui/poster-card.tsx:236
|
||||||
msgid "Remove from Library"
|
msgid "Remove from Library"
|
||||||
msgstr "Supprimer de la bibliothèque"
|
msgstr "Supprimer de la bibliothèque"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:101
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:120
|
||||||
|
msgid "Remove from library?"
|
||||||
|
msgstr "Retirer de la bibliothèque ?"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:268
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:268
|
||||||
msgid "Remove Photo"
|
msgid "Remove Photo"
|
||||||
msgstr "Supprimer la photo"
|
msgstr "Supprimer la photo"
|
||||||
@@ -1752,9 +1784,9 @@ msgstr "Supprimer la photo"
|
|||||||
msgid "Remove profile picture"
|
msgid "Remove profile picture"
|
||||||
msgstr "Supprimer la photo de profil"
|
msgstr "Supprimer la photo de profil"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:65
|
#: apps/native/src/hooks/use-title-actions.ts:63
|
||||||
#: apps/native/src/lib/title-actions.ts:74
|
#: apps/native/src/lib/title-actions.ts:50
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:98
|
#: apps/web/src/components/titles/use-title-actions.ts:95
|
||||||
msgid "Removed from library"
|
msgid "Removed from library"
|
||||||
msgstr "Supprimé de la bibliothèque"
|
msgstr "Supprimé de la bibliothèque"
|
||||||
|
|
||||||
@@ -1861,14 +1893,14 @@ msgstr "Sauvegardes planifiées activées"
|
|||||||
#: apps/native/src/app/(tabs)/(search)/_layout.tsx:7
|
#: apps/native/src/app/(tabs)/(search)/_layout.tsx:7
|
||||||
#: apps/native/src/components/navigation/native-tab-bar.tsx:41
|
#: apps/native/src/components/navigation/native-tab-bar.tsx:41
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr ""
|
msgstr "Recherche"
|
||||||
|
|
||||||
#: apps/web/src/components/dashboard/stats-section.tsx:35
|
#: apps/web/src/components/dashboard/stats-section.tsx:35
|
||||||
msgid "Search for movies and TV shows to start tracking"
|
msgid "Search for movies and TV shows to start tracking"
|
||||||
msgstr "Recherchez des films et séries pour commencer à les suivre"
|
msgstr "Recherchez des films et séries pour commencer à les suivre"
|
||||||
|
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:72
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:72
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:55
|
#: apps/native/src/components/search/recently-viewed-list.tsx:81
|
||||||
msgid "Search for movies, shows, or people"
|
msgid "Search for movies, shows, or people"
|
||||||
msgstr "Rechercher des films, séries ou personnes"
|
msgstr "Rechercher des films, séries ou personnes"
|
||||||
|
|
||||||
@@ -1892,13 +1924,13 @@ msgstr "Rechercher…"
|
|||||||
#. placeholder {0}: season.seasonNumber
|
#. placeholder {0}: season.seasonNumber
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:113
|
#: apps/native/src/components/titles/season-accordion.tsx:113
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:119
|
#: apps/native/src/components/titles/season-accordion.tsx:119
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:274
|
#: apps/web/src/components/titles/use-title-actions.ts:266
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:313
|
#: apps/web/src/components/titles/use-title-actions.ts:305
|
||||||
msgid "Season {0}"
|
msgid "Season {0}"
|
||||||
msgstr "Saison {0}"
|
msgstr "Saison {0}"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:121
|
#: apps/native/src/hooks/use-title-actions.ts:119
|
||||||
#: apps/native/src/lib/title-actions.ts:119
|
#: apps/native/src/lib/title-actions.ts:109
|
||||||
msgid "Season watched"
|
msgid "Season watched"
|
||||||
msgstr "Saison visionnée"
|
msgstr "Saison visionnée"
|
||||||
|
|
||||||
@@ -1907,7 +1939,7 @@ msgid "Seasons"
|
|||||||
msgstr "Saisons"
|
msgstr "Saisons"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:452
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:452
|
||||||
#: apps/web/src/routes/_app/settings.tsx:167
|
#: apps/web/src/routes/_app/settings.tsx:169
|
||||||
msgid "Security"
|
msgid "Security"
|
||||||
msgstr "Sécurité"
|
msgstr "Sécurité"
|
||||||
|
|
||||||
@@ -1915,7 +1947,7 @@ msgstr "Sécurité"
|
|||||||
msgid "Self-hosted movie & TV tracker"
|
msgid "Self-hosted movie & TV tracker"
|
||||||
msgstr "Suivi de films et séries auto-hébergé"
|
msgstr "Suivi de films et séries auto-hébergé"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:151
|
#: apps/web/src/routes/_app/settings.tsx:153
|
||||||
msgid "Server"
|
msgid "Server"
|
||||||
msgstr "Serveur"
|
msgstr "Serveur"
|
||||||
|
|
||||||
@@ -1947,12 +1979,12 @@ msgstr "Définissez votre profil de qualité et dossier racine préférés"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Paramètres"
|
msgstr "Paramètres"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:271
|
#: apps/native/src/components/settings/integration-card.tsx:280
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:248
|
#: apps/web/src/components/settings/integration-card.tsx:248
|
||||||
msgid "Setup instructions"
|
msgid "Setup instructions"
|
||||||
msgstr "Instructions de configuration"
|
msgstr "Instructions de configuration"
|
||||||
|
|
||||||
#: apps/web/src/routes/setup.tsx:95
|
#: apps/web/src/routes/setup.tsx:96
|
||||||
msgid "Setup required"
|
msgid "Setup required"
|
||||||
msgstr "Configuration requise"
|
msgstr "Configuration requise"
|
||||||
|
|
||||||
@@ -1977,7 +2009,7 @@ msgstr "Se connecter"
|
|||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Se connecter"
|
msgstr "Se connecter"
|
||||||
|
|
||||||
#: apps/web/src/routes/_auth/register.tsx:45
|
#: apps/web/src/routes/_auth/register.tsx:42
|
||||||
msgid "Sign in instead"
|
msgid "Sign in instead"
|
||||||
msgstr "Se connecter"
|
msgstr "Se connecter"
|
||||||
|
|
||||||
@@ -2031,13 +2063,13 @@ msgid "Sofa will automatically log movies and episodes when you finish watching
|
|||||||
msgstr "Sofa enregistrera automatiquement les films et épisodes lorsque vous aurez fini de les regarder"
|
msgstr "Sofa enregistrera automatiquement les films et épisodes lorsque vous aurez fini de les regarder"
|
||||||
|
|
||||||
#: apps/native/src/app/change-password.tsx:77
|
#: apps/native/src/app/change-password.tsx:77
|
||||||
#: apps/native/src/app/person/[id].tsx:169
|
#: apps/native/src/app/person/[id].tsx:254
|
||||||
#: apps/web/src/components/settings/account-section.tsx:391
|
#: apps/web/src/components/settings/account-section.tsx:391
|
||||||
#: apps/web/src/routes/__root.tsx:139
|
#: apps/web/src/routes/__root.tsx:139
|
||||||
msgid "Something went wrong"
|
msgid "Something went wrong"
|
||||||
msgstr "Une erreur s'est produite"
|
msgstr "Une erreur s'est produite"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:113
|
#: apps/web/src/routes/_app/titles.$id.tsx:114
|
||||||
msgid "Something went wrong while loading this title. Please try again."
|
msgid "Something went wrong while loading this title. Please try again."
|
||||||
msgstr "Une erreur s'est produite lors du chargement de ce titre. Veuillez réessayer."
|
msgstr "Une erreur s'est produite lors du chargement de ce titre. Veuillez réessayer."
|
||||||
|
|
||||||
@@ -2070,7 +2102,7 @@ msgstr "À partir de"
|
|||||||
msgid "Starting import..."
|
msgid "Starting import..."
|
||||||
msgstr "Démarrage de l'importation..."
|
msgstr "Démarrage de l'importation..."
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:64
|
#: apps/native/src/hooks/use-title-actions.ts:62
|
||||||
msgid "Status updated"
|
msgid "Status updated"
|
||||||
msgstr "Statut mis à jour"
|
msgstr "Statut mis à jour"
|
||||||
|
|
||||||
@@ -2095,11 +2127,11 @@ msgstr "Passer à {0}"
|
|||||||
msgid "The page you're looking for doesn't exist."
|
msgid "The page you're looking for doesn't exist."
|
||||||
msgstr "La page que vous recherchez n'existe pas."
|
msgstr "La page que vous recherchez n'existe pas."
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:53
|
#: apps/web/src/routes/_app/people.$id.tsx:55
|
||||||
msgid "The person you're looking for doesn't exist or may have been removed from the database."
|
msgid "The person you're looking for doesn't exist or may have been removed from the database."
|
||||||
msgstr "La personne que vous recherchez n'existe pas ou a peut-être été supprimée de la base de données."
|
msgstr "La personne que vous recherchez n'existe pas ou a peut-être été supprimée de la base de données."
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:142
|
#: apps/web/src/routes/_app/titles.$id.tsx:143
|
||||||
msgid "The title you're looking for doesn't exist or may have been removed from the database."
|
msgid "The title you're looking for doesn't exist or may have been removed from the database."
|
||||||
msgstr "Le titre que vous recherchez n'existe pas ou a peut-être été supprimé de la base de données."
|
msgstr "Le titre que vous recherchez n'existe pas ou a peut-être été supprimé de la base de données."
|
||||||
|
|
||||||
@@ -2109,7 +2141,7 @@ msgstr "Cela peut prendre quelques minutes pour les grandes bibliothèques. Ne f
|
|||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:89
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:89
|
||||||
msgid "this month"
|
msgid "this month"
|
||||||
msgstr ""
|
msgstr "ce mois-ci"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:31
|
#: apps/native/src/components/dashboard/stats-card.tsx:31
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:135
|
#: apps/web/src/components/dashboard/stats-display.tsx:135
|
||||||
@@ -2121,14 +2153,19 @@ msgid "This page was left on the cutting room floor. It may have been moved, rem
|
|||||||
msgstr "Cette page est restée sur le plancher de la salle de montage. Elle a peut-être été déplacée, supprimée, ou n'a jamais dépassé le stade du scénario."
|
msgstr "Cette page est restée sur le plancher de la salle de montage. Elle a peut-être été déplacée, supprimée, ou n'a jamais dépassé le stade du scénario."
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:559
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:559
|
||||||
#: apps/web/src/routes/_app/settings.tsx:112
|
#: apps/web/src/routes/_app/settings.tsx:114
|
||||||
#: apps/web/src/routes/setup.tsx:180
|
#: apps/web/src/routes/setup.tsx:181
|
||||||
msgid "This product uses the TMDB API but is not endorsed or certified by TMDB."
|
msgid "This product uses the TMDB API but is not endorsed or certified by TMDB."
|
||||||
msgstr "Ce produit utilise l'API TMDB mais n'est pas approuvé ni certifié par TMDB."
|
msgstr "Ce produit utilise l'API TMDB mais n'est pas approuvé ni certifié par TMDB."
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:102
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:123
|
||||||
|
msgid "This title will be removed from your library. Your watch history and ratings will be kept."
|
||||||
|
msgstr "Ce titre sera retiré de votre bibliothèque. Votre historique de visionnage et vos notes seront conservés."
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:88
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:88
|
||||||
msgid "this week"
|
msgid "this week"
|
||||||
msgstr ""
|
msgstr "cette semaine"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:30
|
#: apps/native/src/components/dashboard/stats-card.tsx:30
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:134
|
#: apps/web/src/components/dashboard/stats-display.tsx:134
|
||||||
@@ -2147,7 +2184,7 @@ msgstr "Cela supprimera tous les titres ébauches non enrichis et toutes les ima
|
|||||||
msgid "This will delete un-enriched stub titles that aren't in any user's library and clean up orphaned person records. Deleted titles will be re-imported if accessed again."
|
msgid "This will delete un-enriched stub titles that aren't in any user's library and clean up orphaned person records. Deleted titles will be re-imported if accessed again."
|
||||||
msgstr "Cela supprimera les titres ébauches non enrichis qui ne sont dans aucune bibliothèque et nettoiera les enregistrements de personnes orphelines. Les titres supprimés seront réimportés s'ils sont consultés à nouveau."
|
msgstr "Cela supprimera les titres ébauches non enrichis qui ne sont dans aucune bibliothèque et nettoiera les enregistrements de personnes orphelines. Les titres supprimés seront réimportés s'ils sont consultés à nouveau."
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:124
|
#: apps/native/src/components/settings/integration-card.tsx:133
|
||||||
msgid "This will invalidate the current {label} URL. You'll need to update it in {label}."
|
msgid "This will invalidate the current {label} URL. You'll need to update it in {label}."
|
||||||
msgstr "Cela invalidera l'URL {label} actuelle. Vous devrez la mettre à jour dans {label}."
|
msgstr "Cela invalidera l'URL {label} actuelle. Vous devrez la mettre à jour dans {label}."
|
||||||
|
|
||||||
@@ -2171,7 +2208,7 @@ msgstr "Cela remplacera toute votre base de données par le fichier télécharg
|
|||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:90
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:90
|
||||||
msgid "this year"
|
msgid "this year"
|
||||||
msgstr ""
|
msgstr "cette année"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:32
|
#: apps/native/src/components/dashboard/stats-card.tsx:32
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:136
|
#: apps/web/src/components/dashboard/stats-display.tsx:136
|
||||||
@@ -2187,7 +2224,7 @@ msgid "Time:"
|
|||||||
msgstr "Heure :"
|
msgstr "Heure :"
|
||||||
|
|
||||||
#: apps/native/src/app/title/[id].tsx:231
|
#: apps/native/src/app/title/[id].tsx:231
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:139
|
#: apps/web/src/routes/_app/titles.$id.tsx:140
|
||||||
msgid "Title not found"
|
msgid "Title not found"
|
||||||
msgstr "Titre introuvable"
|
msgstr "Titre introuvable"
|
||||||
|
|
||||||
@@ -2203,7 +2240,7 @@ msgstr "Les titres de votre liste de suivi Sofa seront automatiquement ajoutés
|
|||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:87
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:87
|
||||||
msgid "today"
|
msgid "today"
|
||||||
msgstr ""
|
msgstr "aujourd'hui"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:29
|
#: apps/native/src/components/dashboard/stats-card.tsx:29
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:133
|
#: apps/web/src/components/dashboard/stats-display.tsx:133
|
||||||
@@ -2236,7 +2273,7 @@ msgid "Trending today"
|
|||||||
msgstr "Tendance aujourd'hui"
|
msgstr "Tendance aujourd'hui"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:77
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:77
|
||||||
#: apps/web/src/routes/_app/explore.tsx:129
|
#: apps/web/src/routes/_app/explore.tsx:131
|
||||||
msgid "Trending Today"
|
msgid "Trending Today"
|
||||||
msgstr "Tendances du jour"
|
msgstr "Tendances du jour"
|
||||||
|
|
||||||
@@ -2291,11 +2328,11 @@ msgid "Unwatch all"
|
|||||||
msgstr "Tout démarquer"
|
msgstr "Tout démarquer"
|
||||||
|
|
||||||
#. placeholder {0}: season.name ?? t`Season ${season.seasonNumber}`
|
#. placeholder {0}: season.name ?? t`Season ${season.seasonNumber}`
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:313
|
#: apps/web/src/components/titles/use-title-actions.ts:305
|
||||||
msgid "Unwatched all of {0}"
|
msgid "Unwatched all of {0}"
|
||||||
msgstr "Tout démarqué de {0}"
|
msgstr "Tout démarqué de {0}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:156
|
#: apps/web/src/components/titles/use-title-actions.ts:154
|
||||||
msgid "Unwatched S{seasonNum} E{epNum}"
|
msgid "Unwatched S{seasonNum} E{epNum}"
|
||||||
msgstr "Démarqué S{seasonNum} E{epNum}"
|
msgstr "Démarqué S{seasonNum} E{epNum}"
|
||||||
|
|
||||||
@@ -2366,7 +2403,7 @@ msgstr "Télécharger une photo"
|
|||||||
msgid "Upload profile picture"
|
msgid "Upload profile picture"
|
||||||
msgstr "Télécharger une photo de profil"
|
msgstr "Télécharger une photo de profil"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:117
|
#: apps/native/src/components/settings/integration-card.tsx:125
|
||||||
msgid "URL copied to clipboard"
|
msgid "URL copied to clipboard"
|
||||||
msgstr "URL copiée dans le presse-papiers"
|
msgstr "URL copiée dans le presse-papiers"
|
||||||
|
|
||||||
@@ -2399,36 +2436,36 @@ msgstr "Historique de visionnage"
|
|||||||
msgid "Watch on {name}"
|
msgid "Watch on {name}"
|
||||||
msgstr "Regarder sur {name}"
|
msgstr "Regarder sur {name}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:277
|
#: apps/web/src/components/titles/use-title-actions.ts:269
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:286
|
#: apps/web/src/components/titles/use-title-actions.ts:278
|
||||||
msgid "Watched all of {seasonLabel}"
|
msgid "Watched all of {seasonLabel}"
|
||||||
msgstr "Tout visionné de {seasonLabel}"
|
msgstr "Tout visionné de {seasonLabel}"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:119
|
#: apps/native/src/lib/title-actions.ts:109
|
||||||
msgid "Watched all of {seasonName}"
|
msgid "Watched all of {seasonName}"
|
||||||
msgstr "Tout visionné de {seasonName}"
|
msgstr "Tout visionné de {seasonName}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:199
|
#: apps/web/src/components/titles/use-title-actions.ts:197
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:208
|
#: apps/web/src/components/titles/use-title-actions.ts:206
|
||||||
msgid "Watched S{seasonNum} E{epNum}"
|
msgid "Watched S{seasonNum} E{epNum}"
|
||||||
msgstr "Visionné S{seasonNum} E{epNum}"
|
msgstr "Visionné S{seasonNum} E{epNum}"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:43
|
#: apps/native/src/components/titles/status-action-button.tsx:48
|
||||||
#: apps/web/src/components/title-card.tsx:69
|
#: apps/web/src/components/title-card.tsx:69
|
||||||
#: apps/web/src/components/titles/status-button.tsx:14
|
#: apps/web/src/components/titles/status-button.tsx:47
|
||||||
msgid "Watching"
|
msgid "Watching"
|
||||||
msgstr "En cours"
|
msgstr "En cours"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:78
|
#: apps/native/src/components/titles/status-action-button.tsx:85
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:743
|
#: apps/web/src/components/settings/imports-section.tsx:743
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:769
|
#: apps/web/src/components/settings/imports-section.tsx:769
|
||||||
#: apps/web/src/components/titles/status-button.tsx:49
|
#: apps/web/src/components/titles/status-button.tsx:82
|
||||||
msgid "Watchlist"
|
msgid "Watchlist"
|
||||||
msgstr "Liste de suivi"
|
msgstr "Liste de suivi"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:41
|
#: apps/native/src/components/titles/status-action-button.tsx:41
|
||||||
msgid "Watchlisted"
|
#~ msgid "Watchlisted"
|
||||||
msgstr "Dans la liste de suivi"
|
#~ msgstr "Dans la liste de suivi"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-configs.ts:51
|
#: apps/native/src/components/settings/integration-configs.ts:51
|
||||||
#: apps/native/src/components/settings/integration-configs.ts:66
|
#: apps/native/src/components/settings/integration-configs.ts:66
|
||||||
@@ -2458,7 +2495,7 @@ msgstr "Où regarder"
|
|||||||
msgid "With Ads"
|
msgid "With Ads"
|
||||||
msgstr "Avec publicités"
|
msgstr "Avec publicités"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:52
|
#: apps/native/src/app/person/[id].tsx:140
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:30
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:30
|
||||||
#: apps/web/src/components/people/person-hero.tsx:73
|
#: apps/web/src/components/people/person-hero.tsx:73
|
||||||
msgid "Writer"
|
msgid "Writer"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
+217
-180
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+206
-169
@@ -57,7 +57,7 @@ msgstr "{0} imagens em cache"
|
|||||||
#. placeholder {1}: member.episodeCount !== 1 ? "s" : ""
|
#. placeholder {1}: member.episodeCount !== 1 ? "s" : ""
|
||||||
#: apps/web/src/components/titles/cast-carousel.tsx:78
|
#: apps/web/src/components/titles/cast-carousel.tsx:78
|
||||||
msgid "{0} ep{1}"
|
msgid "{0} ep{1}"
|
||||||
msgstr ""
|
msgstr "{0} ep{1}"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:472
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:472
|
||||||
#~ msgid "{0} images"
|
#~ msgid "{0} images"
|
||||||
@@ -104,8 +104,8 @@ msgstr "{0}/{1} {2, plural, one {episódio} other {episódios}}"
|
|||||||
#~ msgid "{0}/{1} episodes"
|
#~ msgid "{0}/{1} episodes"
|
||||||
#~ msgstr "{0}/{1} episodes"
|
#~ msgstr "{0}/{1} episodes"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:200
|
#: apps/web/src/components/titles/use-title-actions.ts:198
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:278
|
#: apps/web/src/components/titles/use-title-actions.ts:270
|
||||||
msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
|
msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
|
||||||
msgstr "{count} {count, plural, one {episódio anterior não assistido} other {episódios anteriores não assistidos}}"
|
msgstr "{count} {count, plural, one {episódio anterior não assistido} other {episódios anteriores não assistidos}}"
|
||||||
|
|
||||||
@@ -114,22 +114,22 @@ msgstr "{count} {count, plural, one {episódio anterior não assistido} other {e
|
|||||||
msgid "{healthyCount} of {0} jobs healthy"
|
msgid "{healthyCount} of {0} jobs healthy"
|
||||||
msgstr "{healthyCount} de {0} tarefas saudáveis"
|
msgstr "{healthyCount} de {0} tarefas saudáveis"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:84
|
#: apps/native/src/components/settings/integration-card.tsx:86
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:89
|
#: apps/web/src/components/settings/integration-card.tsx:89
|
||||||
msgid "{label} connected"
|
msgid "{label} connected"
|
||||||
msgstr "{label} conectado"
|
msgstr "{label} conectado"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:94
|
#: apps/native/src/components/settings/integration-card.tsx:96
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:105
|
#: apps/web/src/components/settings/integration-card.tsx:105
|
||||||
msgid "{label} disconnected"
|
msgid "{label} disconnected"
|
||||||
msgstr "{label} desconectado"
|
msgstr "{label} desconectado"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:104
|
#: apps/native/src/components/settings/integration-card.tsx:106
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:119
|
#: apps/web/src/components/settings/integration-card.tsx:119
|
||||||
msgid "{label} URL regenerated"
|
msgid "{label} URL regenerated"
|
||||||
msgstr "URL de {label} regenerada"
|
msgstr "URL de {label} regenerada"
|
||||||
|
|
||||||
#: apps/web/src/components/title-card.tsx:152
|
#: apps/web/src/components/title-card.tsx:157
|
||||||
msgid "{watched}/{total} episodes"
|
msgid "{watched}/{total} episodes"
|
||||||
msgstr "{watched}/{total} episódios"
|
msgstr "{watched}/{total} episódios"
|
||||||
|
|
||||||
@@ -157,7 +157,7 @@ msgstr "Conta"
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Ações"
|
msgstr "Ações"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:50
|
#: apps/native/src/app/person/[id].tsx:138
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:28
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:28
|
||||||
#: apps/web/src/components/people/person-hero.tsx:69
|
#: apps/web/src/components/people/person-hero.tsx:69
|
||||||
msgid "Actor"
|
msgid "Actor"
|
||||||
@@ -180,13 +180,13 @@ msgstr "Adicione um novo webhook e cole a URL acima"
|
|||||||
msgid "Add to Library"
|
msgid "Add to Library"
|
||||||
msgstr "Adicionar à Biblioteca"
|
msgstr "Adicionar à Biblioteca"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:73
|
#: apps/native/src/components/titles/status-action-button.tsx:80
|
||||||
msgid "Add to watchlist"
|
msgid "Add to watchlist"
|
||||||
msgstr "Adicionar à lista de desejos"
|
msgstr "Adicionar à lista de desejos"
|
||||||
|
|
||||||
#: apps/native/src/components/explore/hero-banner.tsx:132
|
#: apps/native/src/components/explore/hero-banner.tsx:132
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:212
|
#: apps/native/src/components/ui/poster-card.tsx:215
|
||||||
#: apps/web/src/components/title-card.tsx:133
|
#: apps/web/src/components/title-card.tsx:138
|
||||||
msgid "Add to Watchlist"
|
msgid "Add to Watchlist"
|
||||||
msgstr "Adicionar à Lista de Desejos"
|
msgstr "Adicionar à Lista de Desejos"
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ msgstr "Adicionado \"{titleName}\" à lista de desejos"
|
|||||||
#: apps/native/src/hooks/use-title-actions.ts:44
|
#: apps/native/src/hooks/use-title-actions.ts:44
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:59
|
#: apps/native/src/hooks/use-title-actions.ts:59
|
||||||
#: apps/native/src/lib/title-actions.ts:25
|
#: apps/native/src/lib/title-actions.ts:25
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:98
|
#: apps/web/src/components/titles/use-title-actions.ts:95
|
||||||
msgid "Added to watchlist"
|
msgid "Added to watchlist"
|
||||||
msgstr "Adicionado à lista de desejos"
|
msgstr "Adicionado à lista de desejos"
|
||||||
|
|
||||||
@@ -209,11 +209,11 @@ msgstr "Adicionado à lista de desejos"
|
|||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Administrador"
|
msgstr "Administrador"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:154
|
#: apps/web/src/routes/_app/settings.tsx:156
|
||||||
msgid "Admin only"
|
msgid "Admin only"
|
||||||
msgstr "Apenas administradores"
|
msgstr "Apenas administradores"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:249
|
#: apps/native/src/app/person/[id].tsx:189
|
||||||
#: apps/web/src/components/people/person-hero.tsx:89
|
#: apps/web/src/components/people/person-hero.tsx:89
|
||||||
msgid "age {age}"
|
msgid "age {age}"
|
||||||
msgstr "idade {age}"
|
msgstr "idade {age}"
|
||||||
@@ -243,7 +243,7 @@ msgstr "Ocorreu um erro inesperado ao carregar esta página. Você pode tentar n
|
|||||||
msgid "Anonymous usage reporting"
|
msgid "Anonymous usage reporting"
|
||||||
msgstr "Relatório de uso anônimo"
|
msgstr "Relatório de uso anônimo"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:135
|
#: apps/web/src/routes/_app/settings.tsx:137
|
||||||
msgid "App Settings"
|
msgid "App Settings"
|
||||||
msgstr "Configurações do App"
|
msgstr "Configurações do App"
|
||||||
|
|
||||||
@@ -251,7 +251,7 @@ msgstr "Configurações do App"
|
|||||||
msgid "Application"
|
msgid "Application"
|
||||||
msgstr "Aplicativo"
|
msgstr "Aplicativo"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:139
|
#: apps/native/src/components/settings/integration-card.tsx:148
|
||||||
msgid "Are you sure you want to disconnect {label}? The current URL will stop working."
|
msgid "Are you sure you want to disconnect {label}? The current URL will stop working."
|
||||||
msgstr "Tem certeza que deseja desconectar {label}? A URL atual deixará de funcionar."
|
msgstr "Tem certeza que deseja desconectar {label}? A URL atual deixará de funcionar."
|
||||||
|
|
||||||
@@ -295,7 +295,7 @@ msgstr "Tarefas em segundo plano"
|
|||||||
|
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:309
|
#: apps/web/src/components/settings/system-health-section.tsx:309
|
||||||
msgid "Backup"
|
msgid "Backup"
|
||||||
msgstr ""
|
msgstr "Backup"
|
||||||
|
|
||||||
#: apps/web/src/components/settings/backup-section.tsx:62
|
#: apps/web/src/components/settings/backup-section.tsx:62
|
||||||
msgid "Backup created"
|
msgid "Backup created"
|
||||||
@@ -310,9 +310,9 @@ msgid "Backup schedule"
|
|||||||
msgstr "Agendamento de backup"
|
msgstr "Agendamento de backup"
|
||||||
|
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:583
|
#: apps/web/src/components/settings/system-health-section.tsx:583
|
||||||
#: apps/web/src/routes/_app/settings.tsx:190
|
#: apps/web/src/routes/_app/settings.tsx:192
|
||||||
msgid "Backups"
|
msgid "Backups"
|
||||||
msgstr ""
|
msgstr "Backups"
|
||||||
|
|
||||||
#: apps/web/src/components/settings/backup-schedule-section.tsx:272
|
#: apps/web/src/components/settings/backup-schedule-section.tsx:272
|
||||||
#~ msgid "backups."
|
#~ msgid "backups."
|
||||||
@@ -337,8 +337,9 @@ msgstr "Não foi possível alcançar o servidor"
|
|||||||
#: apps/native/src/components/header-avatar.tsx:63
|
#: apps/native/src/components/header-avatar.tsx:63
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:58
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:58
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:32
|
#: apps/native/src/components/search/recently-viewed-list.tsx:32
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:126
|
#: apps/native/src/components/settings/integration-card.tsx:135
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:141
|
#: apps/native/src/components/settings/integration-card.tsx:150
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:104
|
||||||
#: apps/web/src/components/settings/account-section.tsx:477
|
#: apps/web/src/components/settings/account-section.tsx:477
|
||||||
#: apps/web/src/components/settings/backup-restore-section.tsx:101
|
#: apps/web/src/components/settings/backup-restore-section.tsx:101
|
||||||
#: apps/web/src/components/settings/backup-section.tsx:240
|
#: apps/web/src/components/settings/backup-section.tsx:240
|
||||||
@@ -348,6 +349,7 @@ msgstr "Não foi possível alcançar o servidor"
|
|||||||
#: apps/web/src/components/settings/imports-section.tsx:611
|
#: apps/web/src/components/settings/imports-section.tsx:611
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:674
|
#: apps/web/src/components/settings/imports-section.tsx:674
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:798
|
#: apps/web/src/components/settings/imports-section.tsx:798
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:131
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:127
|
#: apps/web/src/components/titles/title-seasons.tsx:127
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
@@ -361,14 +363,20 @@ msgstr "Cancelar edição"
|
|||||||
msgid "Cast"
|
msgid "Cast"
|
||||||
msgstr "Elenco"
|
msgstr "Elenco"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:202
|
#: apps/web/src/components/titles/use-title-actions.ts:200
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:280
|
#: apps/web/src/components/titles/use-title-actions.ts:272
|
||||||
msgid "Catch up"
|
msgid "Catch up"
|
||||||
msgstr "Colocar em dia"
|
msgstr "Colocar em dia"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:50
|
||||||
|
#: apps/web/src/components/title-card.tsx:74
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:54
|
||||||
|
msgid "Caught Up"
|
||||||
|
msgstr "Em dia"
|
||||||
|
|
||||||
#. placeholder {0}: episodeIds.length
|
#. placeholder {0}: episodeIds.length
|
||||||
#. placeholder {1}: episodeIds.length
|
#. placeholder {1}: episodeIds.length
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:72
|
#: apps/web/src/components/titles/use-title-actions.ts:69
|
||||||
msgid "Caught up — marked {0} {1, plural, one {episode} other {episodes}} as watched"
|
msgid "Caught up — marked {0} {1, plural, one {episode} other {episodes}} as watched"
|
||||||
msgstr "Em dia — {0} {1, plural, one {episódio marcado como assistido} other {episódios marcados como assistidos}}"
|
msgstr "Em dia — {0} {1, plural, one {episódio marcado como assistido} other {episódios marcados como assistidos}}"
|
||||||
|
|
||||||
@@ -418,7 +426,7 @@ msgstr "Escolha como importar seus dados do {0}."
|
|||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:60
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:60
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:104
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:104
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:34
|
#: apps/native/src/components/search/recently-viewed-list.tsx:34
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:86
|
#: apps/native/src/components/search/recently-viewed-list.tsx:68
|
||||||
msgid "Clear"
|
msgid "Clear"
|
||||||
msgstr "Limpar"
|
msgstr "Limpar"
|
||||||
|
|
||||||
@@ -455,10 +463,10 @@ msgid "Close"
|
|||||||
msgstr "Fechar"
|
msgstr "Fechar"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:146
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:146
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:45
|
#: apps/native/src/components/titles/status-action-button.tsx:52
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:219
|
#: apps/web/src/components/dashboard/stats-display.tsx:219
|
||||||
#: apps/web/src/components/title-card.tsx:74
|
#: apps/web/src/components/title-card.tsx:79
|
||||||
#: apps/web/src/components/titles/status-button.tsx:25
|
#: apps/web/src/components/titles/status-button.tsx:59
|
||||||
msgid "Completed"
|
msgid "Completed"
|
||||||
msgstr "Concluído"
|
msgstr "Concluído"
|
||||||
|
|
||||||
@@ -477,7 +485,7 @@ msgstr "Conectar"
|
|||||||
msgid "Connect {0}"
|
msgid "Connect {0}"
|
||||||
msgstr "Conectar {0}"
|
msgstr "Conectar {0}"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:207
|
#: apps/native/src/components/settings/integration-card.tsx:216
|
||||||
msgid "Connect {label}"
|
msgid "Connect {label}"
|
||||||
msgstr "Conectar {label}"
|
msgstr "Conectar {label}"
|
||||||
|
|
||||||
@@ -485,7 +493,7 @@ msgstr "Conectar {label}"
|
|||||||
msgid "Connect to {source}"
|
msgid "Connect to {source}"
|
||||||
msgstr "Conectar a {source}"
|
msgstr "Conectar a {source}"
|
||||||
|
|
||||||
#: apps/web/src/routes/setup.tsx:98
|
#: apps/web/src/routes/setup.tsx:99
|
||||||
msgid "Connect to TMDB"
|
msgid "Connect to TMDB"
|
||||||
msgstr "Conectar ao TMDB"
|
msgstr "Conectar ao TMDB"
|
||||||
|
|
||||||
@@ -516,7 +524,7 @@ msgstr "Conectando ao servidor..."
|
|||||||
msgid "Connecting..."
|
msgid "Connecting..."
|
||||||
msgstr "Conectando..."
|
msgstr "Conectando..."
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:207
|
#: apps/native/src/components/settings/integration-card.tsx:216
|
||||||
msgid "Connecting…"
|
msgid "Connecting…"
|
||||||
msgstr "Conectando…"
|
msgstr "Conectando…"
|
||||||
|
|
||||||
@@ -545,7 +553,7 @@ msgstr "Copiar URL"
|
|||||||
msgid "Could not load integrations"
|
msgid "Could not load integrations"
|
||||||
msgstr "Não foi possível carregar as integrações"
|
msgstr "Não foi possível carregar as integrações"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:172
|
#: apps/native/src/app/person/[id].tsx:257
|
||||||
msgid "Could not load person details"
|
msgid "Could not load person details"
|
||||||
msgstr "Não foi possível carregar os detalhes da pessoa"
|
msgstr "Não foi possível carregar os detalhes da pessoa"
|
||||||
|
|
||||||
@@ -579,14 +587,14 @@ msgstr "Senha atual"
|
|||||||
msgid "Current password is required"
|
msgid "Current password is required"
|
||||||
msgstr "A senha atual é obrigatória"
|
msgstr "A senha atual é obrigatória"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:216
|
#: apps/web/src/routes/_app/settings.tsx:218
|
||||||
msgid "Danger Zone"
|
msgid "Danger Zone"
|
||||||
msgstr "Zona de Perigo"
|
msgstr "Zona de Perigo"
|
||||||
|
|
||||||
#: apps/web/src/routes/__root.tsx:163
|
#: apps/web/src/routes/__root.tsx:163
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:76
|
#: apps/web/src/routes/_app/people.$id.tsx:78
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:119
|
#: apps/web/src/routes/_app/titles.$id.tsx:120
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:165
|
#: apps/web/src/routes/_app/titles.$id.tsx:166
|
||||||
msgid "Dashboard"
|
msgid "Dashboard"
|
||||||
msgstr "Painel"
|
msgstr "Painel"
|
||||||
|
|
||||||
@@ -630,12 +638,12 @@ msgstr "{0, plural, one {# arquivo excluído} other {# arquivos excluídos}}, {f
|
|||||||
msgid "Device code expired. Please try again."
|
msgid "Device code expired. Please try again."
|
||||||
msgstr "Código do dispositivo expirou. Tente novamente."
|
msgstr "Código do dispositivo expirou. Tente novamente."
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:249
|
#: apps/native/src/app/person/[id].tsx:189
|
||||||
#: apps/web/src/components/people/person-hero.tsx:89
|
#: apps/web/src/components/people/person-hero.tsx:89
|
||||||
msgid "died at {age}"
|
msgid "died at {age}"
|
||||||
msgstr "faleceu aos {age}"
|
msgstr "faleceu aos {age}"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:51
|
#: apps/native/src/app/person/[id].tsx:139
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:29
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:29
|
||||||
#: apps/web/src/components/people/person-hero.tsx:71
|
#: apps/web/src/components/people/person-hero.tsx:71
|
||||||
msgid "Director"
|
msgid "Director"
|
||||||
@@ -646,13 +654,13 @@ msgstr "Diretor"
|
|||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "Desativado"
|
msgstr "Desativado"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:143
|
#: apps/native/src/components/settings/integration-card.tsx:152
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:257
|
#: apps/native/src/components/settings/integration-card.tsx:266
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:234
|
#: apps/web/src/components/settings/integration-card.tsx:234
|
||||||
msgid "Disconnect"
|
msgid "Disconnect"
|
||||||
msgstr "Desconectar"
|
msgstr "Desconectar"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:138
|
#: apps/native/src/components/settings/integration-card.tsx:147
|
||||||
msgid "Disconnect {label}"
|
msgid "Disconnect {label}"
|
||||||
msgstr "Desconectar {label}"
|
msgstr "Desconectar {label}"
|
||||||
|
|
||||||
@@ -685,11 +693,11 @@ msgstr "Baixar"
|
|||||||
msgid "Download backup"
|
msgid "Download backup"
|
||||||
msgstr "Baixar backup"
|
msgstr "Baixar backup"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:54
|
#: apps/native/src/app/person/[id].tsx:142
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:32
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:32
|
||||||
#: apps/web/src/components/people/person-hero.tsx:77
|
#: apps/web/src/components/people/person-hero.tsx:77
|
||||||
msgid "Editor"
|
msgid "Editor"
|
||||||
msgstr ""
|
msgstr "Editor"
|
||||||
|
|
||||||
#: apps/native/src/app/(auth)/login.tsx:123
|
#: apps/native/src/app/(auth)/login.tsx:123
|
||||||
#: apps/native/src/app/(auth)/register.tsx:139
|
#: apps/native/src/app/(auth)/register.tsx:139
|
||||||
@@ -729,24 +737,31 @@ msgstr "Insira a URL do seu servidor Sofa para começar"
|
|||||||
msgid "Environment"
|
msgid "Environment"
|
||||||
msgstr "Ambiente"
|
msgstr "Ambiente"
|
||||||
|
|
||||||
#. placeholder {0}: episode.episodeNumber
|
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:27
|
#: apps/native/src/components/titles/episode-row.tsx:27
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:48
|
#: apps/native/src/components/titles/episode-row.tsx:48
|
||||||
msgid "Episode {0}"
|
#~ msgid "Episode {0}"
|
||||||
msgstr "Episódio {0}"
|
#~ msgstr "Episódio {0}"
|
||||||
|
|
||||||
#. placeholder {0}: episode.episodeNumber
|
|
||||||
#: apps/native/src/components/titles/episode-row.tsx:34
|
#: apps/native/src/components/titles/episode-row.tsx:34
|
||||||
msgid "Episode {0}, {episodeLabel}"
|
#~ msgid "Episode {0}, {episodeLabel}"
|
||||||
msgstr "Episódio {0}, {episodeLabel}"
|
#~ msgstr "Episódio {0}, {episodeLabel}"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:111
|
#: apps/native/src/components/titles/episode-row.tsx:29
|
||||||
#: apps/native/src/lib/title-actions.ts:108
|
#: apps/native/src/components/titles/episode-row.tsx:52
|
||||||
|
msgid "Episode {episodeNumber}"
|
||||||
|
msgstr "Episódio {episodeNumber}"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/episode-row.tsx:38
|
||||||
|
msgid "Episode {episodeNumber}, {episodeLabel}"
|
||||||
|
msgstr "Episódio {episodeNumber}, {episodeLabel}"
|
||||||
|
|
||||||
|
#: apps/native/src/hooks/use-title-actions.ts:109
|
||||||
|
#: apps/native/src/lib/title-actions.ts:84
|
||||||
msgid "Episode unwatched"
|
msgid "Episode unwatched"
|
||||||
msgstr "Episódio não assistido"
|
msgstr "Episódio não assistido"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:101
|
#: apps/native/src/hooks/use-title-actions.ts:99
|
||||||
#: apps/native/src/lib/title-actions.ts:98
|
#: apps/native/src/lib/title-actions.ts:74
|
||||||
msgid "Episode watched"
|
msgid "Episode watched"
|
||||||
msgstr "Episódio assistido"
|
msgstr "Episódio assistido"
|
||||||
|
|
||||||
@@ -758,7 +773,7 @@ msgstr "Episódios"
|
|||||||
#. placeholder {0}: periodLabels[episodePeriod]
|
#. placeholder {0}: periodLabels[episodePeriod]
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:125
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:125
|
||||||
msgid "Episodes {0}"
|
msgid "Episodes {0}"
|
||||||
msgstr ""
|
msgstr "Episódios {0}"
|
||||||
|
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:162
|
#: apps/web/src/components/dashboard/stats-display.tsx:162
|
||||||
#~ msgid "Episodes {periodSelect}"
|
#~ msgid "Episodes {periodSelect}"
|
||||||
@@ -790,8 +805,8 @@ msgstr "Erros ({0})"
|
|||||||
msgid "Explore"
|
msgid "Explore"
|
||||||
msgstr "Explorar"
|
msgstr "Explorar"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:68
|
#: apps/web/src/routes/_app/people.$id.tsx:70
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:157
|
#: apps/web/src/routes/_app/titles.$id.tsx:158
|
||||||
msgid "Explore titles"
|
msgid "Explore titles"
|
||||||
msgstr "Explorar títulos"
|
msgstr "Explorar títulos"
|
||||||
|
|
||||||
@@ -804,7 +819,7 @@ msgstr "Falhou"
|
|||||||
msgid "Failed to add to watchlist"
|
msgid "Failed to add to watchlist"
|
||||||
msgstr "Falha ao adicionar à lista de desejos"
|
msgstr "Falha ao adicionar à lista de desejos"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:80
|
#: apps/web/src/components/titles/use-title-actions.ts:77
|
||||||
msgid "Failed to catch up"
|
msgid "Failed to catch up"
|
||||||
msgstr "Falha ao colocar em dia"
|
msgstr "Falha ao colocar em dia"
|
||||||
|
|
||||||
@@ -817,7 +832,7 @@ msgstr "Falha ao alterar senha"
|
|||||||
msgid "Failed to connect"
|
msgid "Failed to connect"
|
||||||
msgstr "Falha ao conectar"
|
msgstr "Falha ao conectar"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:87
|
#: apps/native/src/components/settings/integration-card.tsx:89
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:91
|
#: apps/web/src/components/settings/integration-card.tsx:91
|
||||||
msgid "Failed to connect {label}"
|
msgid "Failed to connect {label}"
|
||||||
msgstr "Falha ao conectar {label}"
|
msgstr "Falha ao conectar {label}"
|
||||||
@@ -834,7 +849,7 @@ msgstr "Falha ao criar backup"
|
|||||||
msgid "Failed to delete backup"
|
msgid "Failed to delete backup"
|
||||||
msgstr "Falha ao excluir backup"
|
msgstr "Falha ao excluir backup"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:97
|
#: apps/native/src/components/settings/integration-card.tsx:99
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:108
|
#: apps/web/src/components/settings/integration-card.tsx:108
|
||||||
msgid "Failed to disconnect {label}"
|
msgid "Failed to disconnect {label}"
|
||||||
msgstr "Falha ao desconectar {label}"
|
msgstr "Falha ao desconectar {label}"
|
||||||
@@ -843,29 +858,30 @@ msgstr "Falha ao desconectar {label}"
|
|||||||
msgid "Failed to load backup schedule settings."
|
msgid "Failed to load backup schedule settings."
|
||||||
msgstr "Falha ao carregar as configurações do agendamento de backup."
|
msgstr "Falha ao carregar as configurações do agendamento de backup."
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:110
|
#: apps/web/src/routes/_app/titles.$id.tsx:111
|
||||||
msgid "Failed to load title"
|
msgid "Failed to load title"
|
||||||
msgstr "Falha ao carregar título"
|
msgstr "Falha ao carregar título"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:344
|
#: apps/native/src/lib/title-actions.ts:101
|
||||||
|
#: apps/web/src/components/titles/use-title-actions.ts:338
|
||||||
msgid "Failed to mark all episodes as watched"
|
msgid "Failed to mark all episodes as watched"
|
||||||
msgstr "Falha ao marcar todos os episódios como assistidos"
|
msgstr "Falha ao marcar todos os episódios como assistidos"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:79
|
#: apps/native/src/hooks/use-title-actions.ts:77
|
||||||
#: apps/native/src/lib/title-actions.ts:67
|
#: apps/native/src/lib/title-actions.ts:43
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:137
|
#: apps/web/src/components/titles/use-title-actions.ts:134
|
||||||
msgid "Failed to mark as watched"
|
msgid "Failed to mark as watched"
|
||||||
msgstr "Falha ao marcar como assistido"
|
msgstr "Falha ao marcar como assistido"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:104
|
#: apps/native/src/hooks/use-title-actions.ts:102
|
||||||
#: apps/native/src/lib/title-actions.ts:101
|
#: apps/native/src/lib/title-actions.ts:77
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:216
|
#: apps/web/src/components/titles/use-title-actions.ts:214
|
||||||
msgid "Failed to mark episode"
|
msgid "Failed to mark episode"
|
||||||
msgstr "Falha ao marcar episódio"
|
msgstr "Falha ao marcar episódio"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:124
|
#: apps/native/src/hooks/use-title-actions.ts:122
|
||||||
#: apps/native/src/lib/title-actions.ts:123
|
#: apps/native/src/lib/title-actions.ts:113
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:294
|
#: apps/web/src/components/titles/use-title-actions.ts:286
|
||||||
msgid "Failed to mark some episodes"
|
msgid "Failed to mark some episodes"
|
||||||
msgstr "Falha ao marcar alguns episódios"
|
msgstr "Falha ao marcar alguns episódios"
|
||||||
|
|
||||||
@@ -889,12 +905,12 @@ msgstr "Falha ao limpar cache de imagens"
|
|||||||
msgid "Failed to purge metadata cache"
|
msgid "Failed to purge metadata cache"
|
||||||
msgstr "Falha ao limpar cache de metadados"
|
msgstr "Falha ao limpar cache de metadados"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:107
|
#: apps/native/src/components/settings/integration-card.tsx:109
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:121
|
#: apps/web/src/components/settings/integration-card.tsx:121
|
||||||
msgid "Failed to regenerate {label} URL"
|
msgid "Failed to regenerate {label} URL"
|
||||||
msgstr "Falha ao regenerar URL de {label}"
|
msgstr "Falha ao regenerar URL de {label}"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:77
|
#: apps/native/src/lib/title-actions.ts:53
|
||||||
msgid "Failed to remove from library"
|
msgid "Failed to remove from library"
|
||||||
msgstr "Falha ao remover da biblioteca"
|
msgstr "Falha ao remover da biblioteca"
|
||||||
|
|
||||||
@@ -916,13 +932,13 @@ msgstr "Falha ao iniciar conexão com {0}"
|
|||||||
msgid "Failed to trigger job"
|
msgid "Failed to trigger job"
|
||||||
msgstr "Falha ao acionar tarefa"
|
msgstr "Falha ao acionar tarefa"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:114
|
#: apps/native/src/hooks/use-title-actions.ts:112
|
||||||
#: apps/native/src/lib/title-actions.ts:111
|
#: apps/native/src/lib/title-actions.ts:87
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:163
|
#: apps/web/src/components/titles/use-title-actions.ts:161
|
||||||
msgid "Failed to unmark episode"
|
msgid "Failed to unmark episode"
|
||||||
msgstr "Falha ao desmarcar episódio"
|
msgstr "Falha ao desmarcar episódio"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:320
|
#: apps/web/src/components/titles/use-title-actions.ts:312
|
||||||
msgid "Failed to unmark some episodes"
|
msgid "Failed to unmark some episodes"
|
||||||
msgstr "Falha ao desmarcar alguns episódios"
|
msgstr "Falha ao desmarcar alguns episódios"
|
||||||
|
|
||||||
@@ -930,9 +946,9 @@ msgstr "Falha ao desmarcar alguns episódios"
|
|||||||
msgid "Failed to update name"
|
msgid "Failed to update name"
|
||||||
msgstr "Falha ao atualizar nome"
|
msgstr "Falha ao atualizar nome"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:94
|
#: apps/native/src/hooks/use-title-actions.ts:92
|
||||||
#: apps/native/src/lib/title-actions.ts:91
|
#: apps/native/src/lib/title-actions.ts:67
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:123
|
#: apps/web/src/components/titles/use-title-actions.ts:120
|
||||||
msgid "Failed to update rating"
|
msgid "Failed to update rating"
|
||||||
msgstr "Falha ao atualizar avaliação"
|
msgstr "Falha ao atualizar avaliação"
|
||||||
|
|
||||||
@@ -958,10 +974,8 @@ msgstr "Falha ao atualizar configuração de backup agendado"
|
|||||||
msgid "Failed to update setting"
|
msgid "Failed to update setting"
|
||||||
msgstr "Falha ao atualizar configuração"
|
msgstr "Falha ao atualizar configuração"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:69
|
#: apps/native/src/hooks/use-title-actions.ts:67
|
||||||
#: apps/native/src/lib/title-actions.ts:41
|
#: apps/web/src/components/titles/use-title-actions.ts:98
|
||||||
#: apps/native/src/lib/title-actions.ts:55
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:101
|
|
||||||
msgid "Failed to update status"
|
msgid "Failed to update status"
|
||||||
msgstr "Falha ao atualizar status"
|
msgstr "Falha ao atualizar status"
|
||||||
|
|
||||||
@@ -973,7 +987,7 @@ msgstr "Falha ao enviar avatar"
|
|||||||
msgid "Fetching your library data from {source}..."
|
msgid "Fetching your library data from {source}..."
|
||||||
msgstr "Buscando seus dados da biblioteca em {source}..."
|
msgstr "Buscando seus dados da biblioteca em {source}..."
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:279
|
#: apps/native/src/app/person/[id].tsx:219
|
||||||
#: apps/web/src/components/people/filmography-grid.tsx:67
|
#: apps/web/src/components/people/filmography-grid.tsx:67
|
||||||
msgid "Filmography"
|
msgid "Filmography"
|
||||||
msgstr "Filmografia"
|
msgstr "Filmografia"
|
||||||
@@ -1002,8 +1016,8 @@ msgstr "Sexta-feira"
|
|||||||
msgid "Get Started"
|
msgid "Get Started"
|
||||||
msgstr "Começar"
|
msgstr "Começar"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:176
|
#: apps/native/src/app/person/[id].tsx:261
|
||||||
#: apps/native/src/app/person/[id].tsx:196
|
#: apps/native/src/app/person/[id].tsx:281
|
||||||
#: apps/native/src/app/title/[id].tsx:235
|
#: apps/native/src/app/title/[id].tsx:235
|
||||||
msgid "Go back"
|
msgid "Go back"
|
||||||
msgstr "Voltar"
|
msgstr "Voltar"
|
||||||
@@ -1112,6 +1126,11 @@ msgstr "Na biblioteca"
|
|||||||
msgid "In Library"
|
msgid "In Library"
|
||||||
msgstr "Na Biblioteca"
|
msgstr "Na Biblioteca"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:46
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:40
|
||||||
|
msgid "In Watchlist"
|
||||||
|
msgstr "Na lista"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:179
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:179
|
||||||
#: apps/web/src/components/dashboard/library-section.tsx:35
|
#: apps/web/src/components/dashboard/library-section.tsx:35
|
||||||
msgid "In Your Library"
|
msgid "In Your Library"
|
||||||
@@ -1222,22 +1241,23 @@ msgid "Mark all episodes as watched?"
|
|||||||
msgstr "Marcar todos os episódios como assistidos?"
|
msgstr "Marcar todos os episódios como assistidos?"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:152
|
#: apps/native/src/components/titles/season-accordion.tsx:152
|
||||||
|
#: apps/native/src/components/ui/poster-card.tsx:229
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:109
|
#: apps/web/src/components/titles/title-seasons.tsx:109
|
||||||
#: apps/web/src/components/titles/title-seasons.tsx:135
|
#: apps/web/src/components/titles/title-seasons.tsx:135
|
||||||
msgid "Mark All Watched"
|
msgid "Mark All Watched"
|
||||||
msgstr "Marcar Todos como Assistidos"
|
msgstr "Marcar Todos como Assistidos"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/continue-watching-card.tsx:103
|
#: apps/native/src/components/dashboard/continue-watching-card.tsx:103
|
||||||
msgid "Mark as Completed"
|
#~ msgid "Mark as Completed"
|
||||||
msgstr "Marcar como Concluído"
|
#~ msgstr "Marcar como Concluído"
|
||||||
|
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:226
|
#: apps/native/src/components/ui/poster-card.tsx:222
|
||||||
msgid "Mark as Watched"
|
msgid "Mark as Watched"
|
||||||
msgstr "Marcar como Assistido"
|
msgstr "Marcar como Assistido"
|
||||||
|
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:219
|
#: apps/native/src/components/ui/poster-card.tsx:219
|
||||||
msgid "Mark as Watching"
|
#~ msgid "Mark as Watching"
|
||||||
msgstr "Marcar como Assistindo"
|
#~ msgstr "Marcar como Assistindo"
|
||||||
|
|
||||||
#: apps/native/src/app/title/[id].tsx:400
|
#: apps/native/src/app/title/[id].tsx:400
|
||||||
#: apps/web/src/components/titles/title-actions.tsx:27
|
#: apps/web/src/components/titles/title-actions.tsx:27
|
||||||
@@ -1245,32 +1265,37 @@ msgid "Mark Watched"
|
|||||||
msgstr "Marcar como Assistido"
|
msgstr "Marcar como Assistido"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:50
|
#: apps/native/src/lib/title-actions.ts:50
|
||||||
msgid "Marked \"{titleName}\" as completed"
|
#~ msgid "Marked \"{titleName}\" as completed"
|
||||||
msgstr "Marcado \"{titleName}\" como concluído"
|
#~ msgstr "Marcado \"{titleName}\" como concluído"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:63
|
#: apps/native/src/lib/title-actions.ts:39
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:134
|
#: apps/web/src/components/titles/use-title-actions.ts:131
|
||||||
msgid "Marked \"{titleName}\" as watched"
|
msgid "Marked \"{titleName}\" as watched"
|
||||||
msgstr "Marcado \"{titleName}\" como assistido"
|
msgstr "Marcado \"{titleName}\" como assistido"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:337
|
#: apps/native/src/lib/title-actions.ts:97
|
||||||
|
#: apps/web/src/components/titles/use-title-actions.ts:331
|
||||||
msgid "Marked all episodes as watched"
|
msgid "Marked all episodes as watched"
|
||||||
msgstr "Todos os episódios marcados como assistidos"
|
msgstr "Todos os episódios marcados como assistidos"
|
||||||
|
|
||||||
|
#: apps/native/src/lib/title-actions.ts:96
|
||||||
|
msgid "Marked all episodes of \"{titleName}\" as watched"
|
||||||
|
msgstr "Todos os episódios de \"{titleName}\" marcados como vistos"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:61
|
#: apps/native/src/hooks/use-title-actions.ts:61
|
||||||
#: apps/native/src/lib/title-actions.ts:51
|
#: apps/native/src/lib/title-actions.ts:51
|
||||||
msgid "Marked as completed"
|
#~ msgid "Marked as completed"
|
||||||
msgstr "Marcado como concluído"
|
#~ msgstr "Marcado como concluído"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:76
|
#: apps/native/src/hooks/use-title-actions.ts:74
|
||||||
#: apps/native/src/lib/title-actions.ts:63
|
#: apps/native/src/lib/title-actions.ts:39
|
||||||
msgid "Marked as watched"
|
msgid "Marked as watched"
|
||||||
msgstr "Marcado como assistido"
|
msgstr "Marcado como assistido"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:60
|
#: apps/native/src/hooks/use-title-actions.ts:60
|
||||||
#: apps/native/src/lib/title-actions.ts:38
|
#: apps/native/src/lib/title-actions.ts:38
|
||||||
msgid "Marked as watching"
|
#~ msgid "Marked as watching"
|
||||||
msgstr "Marcado como assistindo"
|
#~ msgstr "Marcado como assistindo"
|
||||||
|
|
||||||
#: apps/web/src/components/settings/account-section.tsx:314
|
#: apps/web/src/components/settings/account-section.tsx:314
|
||||||
msgid "Member since {memberSince}"
|
msgid "Member since {memberSince}"
|
||||||
@@ -1305,7 +1330,7 @@ msgstr "Filmes"
|
|||||||
#. placeholder {0}: periodLabels[moviePeriod]
|
#. placeholder {0}: periodLabels[moviePeriod]
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:114
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:114
|
||||||
msgid "Movies {0}"
|
msgid "Movies {0}"
|
||||||
msgstr ""
|
msgstr "Filmes {0}"
|
||||||
|
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:161
|
#: apps/web/src/components/dashboard/stats-display.tsx:161
|
||||||
#~ msgid "Movies {periodSelect}"
|
#~ msgid "Movies {periodSelect}"
|
||||||
@@ -1345,7 +1370,7 @@ msgstr "Nunca executado"
|
|||||||
msgid "New account creation is currently disabled."
|
msgid "New account creation is currently disabled."
|
||||||
msgstr "A criação de novas contas está desativada no momento."
|
msgstr "A criação de novas contas está desativada no momento."
|
||||||
|
|
||||||
#: apps/web/src/routes/_auth/register.tsx:36
|
#: apps/web/src/routes/_auth/register.tsx:33
|
||||||
msgid "New accounts are not being accepted right now. Contact the admin if you need access."
|
msgid "New accounts are not being accepted right now. Contact the admin if you need access."
|
||||||
msgstr "Novas contas não estão sendo aceitas agora. Entre em contato com o administrador se precisar de acesso."
|
msgstr "Novas contas não estão sendo aceitas agora. Entre em contato com o administrador se precisar de acesso."
|
||||||
|
|
||||||
@@ -1403,7 +1428,7 @@ msgstr "Nenhum resultado encontrado."
|
|||||||
msgid "No titles found for this genre."
|
msgid "No titles found for this genre."
|
||||||
msgstr "Nenhum título encontrado para este gênero."
|
msgstr "Nenhum título encontrado para este gênero."
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:174
|
#: apps/native/src/components/settings/integration-card.tsx:183
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:153
|
#: apps/web/src/components/settings/integration-card.tsx:153
|
||||||
#: apps/web/src/components/settings/system-health-section.tsx:229
|
#: apps/web/src/components/settings/system-health-section.tsx:229
|
||||||
msgid "Not configured"
|
msgid "Not configured"
|
||||||
@@ -1517,8 +1542,8 @@ msgstr "Verificar periodicamente o GitHub por novas versões do Sofa"
|
|||||||
msgid "Person"
|
msgid "Person"
|
||||||
msgstr "Pessoa"
|
msgstr "Pessoa"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:192
|
#: apps/native/src/app/person/[id].tsx:277
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:50
|
#: apps/web/src/routes/_app/people.$id.tsx:52
|
||||||
msgid "Person not found"
|
msgid "Person not found"
|
||||||
msgstr "Pessoa não encontrada"
|
msgstr "Pessoa não encontrada"
|
||||||
|
|
||||||
@@ -1527,12 +1552,12 @@ msgid "Play trailer"
|
|||||||
msgstr "Reproduzir trailer"
|
msgstr "Reproduzir trailer"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:89
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:89
|
||||||
#: apps/web/src/routes/_app/explore.tsx:141
|
#: apps/web/src/routes/_app/explore.tsx:143
|
||||||
msgid "Popular Movies"
|
msgid "Popular Movies"
|
||||||
msgstr "Filmes Populares"
|
msgstr "Filmes Populares"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:102
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:102
|
||||||
#: apps/web/src/routes/_app/explore.tsx:151
|
#: apps/web/src/routes/_app/explore.tsx:153
|
||||||
msgid "Popular TV Shows"
|
msgid "Popular TV Shows"
|
||||||
msgstr "Séries Populares"
|
msgstr "Séries Populares"
|
||||||
|
|
||||||
@@ -1540,7 +1565,7 @@ msgstr "Séries Populares"
|
|||||||
msgid "Pre-restore backup"
|
msgid "Pre-restore backup"
|
||||||
msgstr "Backup pré-restauração"
|
msgstr "Backup pré-restauração"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:53
|
#: apps/native/src/app/person/[id].tsx:141
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:31
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:31
|
||||||
#: apps/web/src/components/people/person-hero.tsx:75
|
#: apps/web/src/components/people/person-hero.tsx:75
|
||||||
msgid "Producer"
|
msgid "Producer"
|
||||||
@@ -1612,7 +1637,7 @@ msgstr "URL da Lista do Radarr"
|
|||||||
|
|
||||||
#. placeholder {0}: input.stars
|
#. placeholder {0}: input.stars
|
||||||
#. placeholder {1}: input.stars
|
#. placeholder {1}: input.stars
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:88
|
#: apps/native/src/hooks/use-title-actions.ts:86
|
||||||
msgid "Rated {0} {1, plural, one {star} other {stars}}"
|
msgid "Rated {0} {1, plural, one {star} other {stars}}"
|
||||||
msgstr "Avaliado com {0} {1, plural, one {estrela} other {estrelas}}"
|
msgstr "Avaliado com {0} {1, plural, one {estrela} other {estrelas}}"
|
||||||
|
|
||||||
@@ -1620,11 +1645,11 @@ msgstr "Avaliado com {0} {1, plural, one {estrela} other {estrelas}}"
|
|||||||
#~ msgid "Rated {0} star{1}"
|
#~ msgid "Rated {0} star{1}"
|
||||||
#~ msgstr "Rated {0} star{1}"
|
#~ msgstr "Rated {0} star{1}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:118
|
#: apps/web/src/components/titles/use-title-actions.ts:115
|
||||||
msgid "Rated {ratingStars} {ratingStars, plural, one {star} other {stars}}"
|
msgid "Rated {ratingStars} {ratingStars, plural, one {star} other {stars}}"
|
||||||
msgstr "Avaliado com {ratingStars} {ratingStars, plural, one {estrela} other {estrelas}}"
|
msgstr "Avaliado com {ratingStars} {ratingStars, plural, one {estrela} other {estrelas}}"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:86
|
#: apps/native/src/lib/title-actions.ts:62
|
||||||
msgid "Rated {stars, plural, one {# star} other {# stars}}"
|
msgid "Rated {stars, plural, one {# star} other {# stars}}"
|
||||||
msgstr "Avaliado com {stars, plural, one {# estrela} other {# estrelas}}"
|
msgstr "Avaliado com {stars, plural, one {# estrela} other {# estrelas}}"
|
||||||
|
|
||||||
@@ -1633,9 +1658,9 @@ msgstr "Avaliado com {stars, plural, one {# estrela} other {# estrelas}}"
|
|||||||
msgid "Rating"
|
msgid "Rating"
|
||||||
msgstr "Avaliação"
|
msgstr "Avaliação"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:89
|
#: apps/native/src/hooks/use-title-actions.ts:87
|
||||||
#: apps/native/src/lib/title-actions.ts:87
|
#: apps/native/src/lib/title-actions.ts:63
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:119
|
#: apps/web/src/components/titles/use-title-actions.ts:116
|
||||||
msgid "Rating removed"
|
msgid "Rating removed"
|
||||||
msgstr "Avaliação removida"
|
msgstr "Avaliação removida"
|
||||||
|
|
||||||
@@ -1663,7 +1688,7 @@ msgid "Recent Searches"
|
|||||||
msgstr "Pesquisas Recentes"
|
msgstr "Pesquisas Recentes"
|
||||||
|
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:95
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:95
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:77
|
#: apps/native/src/components/search/recently-viewed-list.tsx:59
|
||||||
msgid "Recently Viewed"
|
msgid "Recently Viewed"
|
||||||
msgstr "Vistos Recentemente"
|
msgstr "Vistos Recentemente"
|
||||||
|
|
||||||
@@ -1692,12 +1717,12 @@ msgstr "Atualizar"
|
|||||||
msgid "Refresh system health"
|
msgid "Refresh system health"
|
||||||
msgstr "Atualizar status de saúde do sistema"
|
msgstr "Atualizar status de saúde do sistema"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:128
|
#: apps/native/src/components/settings/integration-card.tsx:137
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:248
|
#: apps/native/src/components/settings/integration-card.tsx:257
|
||||||
msgid "Regenerate"
|
msgid "Regenerate"
|
||||||
msgstr "Regenerar"
|
msgstr "Regenerar"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:123
|
#: apps/native/src/components/settings/integration-card.tsx:132
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:226
|
#: apps/web/src/components/settings/integration-card.tsx:226
|
||||||
msgid "Regenerate URL"
|
msgid "Regenerate URL"
|
||||||
msgstr "Regenerar URL"
|
msgstr "Regenerar URL"
|
||||||
@@ -1717,7 +1742,7 @@ msgid "Registration closed"
|
|||||||
msgstr "Registro fechado"
|
msgstr "Registro fechado"
|
||||||
|
|
||||||
#: apps/native/src/app/(auth)/register.tsx:87
|
#: apps/native/src/app/(auth)/register.tsx:87
|
||||||
#: apps/web/src/routes/_auth/register.tsx:33
|
#: apps/web/src/routes/_auth/register.tsx:30
|
||||||
msgid "Registration Closed"
|
msgid "Registration Closed"
|
||||||
msgstr "Registro Fechado"
|
msgstr "Registro Fechado"
|
||||||
|
|
||||||
@@ -1726,20 +1751,27 @@ msgstr "Registro Fechado"
|
|||||||
msgid "Registration opened"
|
msgid "Registration opened"
|
||||||
msgstr "Registro aberto"
|
msgstr "Registro aberto"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/status-button.tsx:76
|
#: apps/native/src/components/titles/status-action-button.tsx:106
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:109
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:139
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Remover"
|
msgstr "Remover"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:96
|
#: apps/native/src/components/titles/status-action-button.tsx:115
|
||||||
#: apps/web/src/components/titles/status-button.tsx:60
|
#: apps/web/src/components/titles/status-button.tsx:93
|
||||||
msgid "Remove from library"
|
msgid "Remove from library"
|
||||||
msgstr "Remover da biblioteca"
|
msgstr "Remover da biblioteca"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/continue-watching-card.tsx:108
|
#: apps/native/src/components/dashboard/continue-watching-card.tsx:108
|
||||||
#: apps/native/src/components/ui/poster-card.tsx:233
|
#: apps/native/src/components/ui/poster-card.tsx:236
|
||||||
msgid "Remove from Library"
|
msgid "Remove from Library"
|
||||||
msgstr "Remover da Biblioteca"
|
msgstr "Remover da Biblioteca"
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:101
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:120
|
||||||
|
msgid "Remove from library?"
|
||||||
|
msgstr "Remover da biblioteca?"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:268
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:268
|
||||||
msgid "Remove Photo"
|
msgid "Remove Photo"
|
||||||
msgstr "Remover Foto"
|
msgstr "Remover Foto"
|
||||||
@@ -1752,9 +1784,9 @@ msgstr "Remover foto"
|
|||||||
msgid "Remove profile picture"
|
msgid "Remove profile picture"
|
||||||
msgstr "Remover foto de perfil"
|
msgstr "Remover foto de perfil"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:65
|
#: apps/native/src/hooks/use-title-actions.ts:63
|
||||||
#: apps/native/src/lib/title-actions.ts:74
|
#: apps/native/src/lib/title-actions.ts:50
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:98
|
#: apps/web/src/components/titles/use-title-actions.ts:95
|
||||||
msgid "Removed from library"
|
msgid "Removed from library"
|
||||||
msgstr "Removido da biblioteca"
|
msgstr "Removido da biblioteca"
|
||||||
|
|
||||||
@@ -1861,14 +1893,14 @@ msgstr "Backups agendados ativados"
|
|||||||
#: apps/native/src/app/(tabs)/(search)/_layout.tsx:7
|
#: apps/native/src/app/(tabs)/(search)/_layout.tsx:7
|
||||||
#: apps/native/src/components/navigation/native-tab-bar.tsx:41
|
#: apps/native/src/components/navigation/native-tab-bar.tsx:41
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr ""
|
msgstr "Pesquisar"
|
||||||
|
|
||||||
#: apps/web/src/components/dashboard/stats-section.tsx:35
|
#: apps/web/src/components/dashboard/stats-section.tsx:35
|
||||||
msgid "Search for movies and TV shows to start tracking"
|
msgid "Search for movies and TV shows to start tracking"
|
||||||
msgstr "Pesquise filmes e séries para começar a acompanhar"
|
msgstr "Pesquise filmes e séries para começar a acompanhar"
|
||||||
|
|
||||||
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:72
|
#: apps/native/src/components/search/recently-viewed-list.ios.tsx:72
|
||||||
#: apps/native/src/components/search/recently-viewed-list.tsx:55
|
#: apps/native/src/components/search/recently-viewed-list.tsx:81
|
||||||
msgid "Search for movies, shows, or people"
|
msgid "Search for movies, shows, or people"
|
||||||
msgstr "Pesquise filmes, séries ou pessoas"
|
msgstr "Pesquise filmes, séries ou pessoas"
|
||||||
|
|
||||||
@@ -1892,13 +1924,13 @@ msgstr "Pesquisar…"
|
|||||||
#. placeholder {0}: season.seasonNumber
|
#. placeholder {0}: season.seasonNumber
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:113
|
#: apps/native/src/components/titles/season-accordion.tsx:113
|
||||||
#: apps/native/src/components/titles/season-accordion.tsx:119
|
#: apps/native/src/components/titles/season-accordion.tsx:119
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:274
|
#: apps/web/src/components/titles/use-title-actions.ts:266
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:313
|
#: apps/web/src/components/titles/use-title-actions.ts:305
|
||||||
msgid "Season {0}"
|
msgid "Season {0}"
|
||||||
msgstr "Temporada {0}"
|
msgstr "Temporada {0}"
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:121
|
#: apps/native/src/hooks/use-title-actions.ts:119
|
||||||
#: apps/native/src/lib/title-actions.ts:119
|
#: apps/native/src/lib/title-actions.ts:109
|
||||||
msgid "Season watched"
|
msgid "Season watched"
|
||||||
msgstr "Temporada assistida"
|
msgstr "Temporada assistida"
|
||||||
|
|
||||||
@@ -1907,7 +1939,7 @@ msgid "Seasons"
|
|||||||
msgstr "Temporadas"
|
msgstr "Temporadas"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:452
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:452
|
||||||
#: apps/web/src/routes/_app/settings.tsx:167
|
#: apps/web/src/routes/_app/settings.tsx:169
|
||||||
msgid "Security"
|
msgid "Security"
|
||||||
msgstr "Segurança"
|
msgstr "Segurança"
|
||||||
|
|
||||||
@@ -1915,7 +1947,7 @@ msgstr "Segurança"
|
|||||||
msgid "Self-hosted movie & TV tracker"
|
msgid "Self-hosted movie & TV tracker"
|
||||||
msgstr "Rastreador de filmes e séries auto-hospedado"
|
msgstr "Rastreador de filmes e séries auto-hospedado"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/settings.tsx:151
|
#: apps/web/src/routes/_app/settings.tsx:153
|
||||||
msgid "Server"
|
msgid "Server"
|
||||||
msgstr "Servidor"
|
msgstr "Servidor"
|
||||||
|
|
||||||
@@ -1947,12 +1979,12 @@ msgstr "Defina seu perfil de qualidade preferido e pasta raiz"
|
|||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Configurações"
|
msgstr "Configurações"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:271
|
#: apps/native/src/components/settings/integration-card.tsx:280
|
||||||
#: apps/web/src/components/settings/integration-card.tsx:248
|
#: apps/web/src/components/settings/integration-card.tsx:248
|
||||||
msgid "Setup instructions"
|
msgid "Setup instructions"
|
||||||
msgstr "Instruções de configuração"
|
msgstr "Instruções de configuração"
|
||||||
|
|
||||||
#: apps/web/src/routes/setup.tsx:95
|
#: apps/web/src/routes/setup.tsx:96
|
||||||
msgid "Setup required"
|
msgid "Setup required"
|
||||||
msgstr "Configuração necessária"
|
msgstr "Configuração necessária"
|
||||||
|
|
||||||
@@ -1977,7 +2009,7 @@ msgstr "Entrar"
|
|||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Entrar"
|
msgstr "Entrar"
|
||||||
|
|
||||||
#: apps/web/src/routes/_auth/register.tsx:45
|
#: apps/web/src/routes/_auth/register.tsx:42
|
||||||
msgid "Sign in instead"
|
msgid "Sign in instead"
|
||||||
msgstr "Entrar em vez disso"
|
msgstr "Entrar em vez disso"
|
||||||
|
|
||||||
@@ -2031,13 +2063,13 @@ msgid "Sofa will automatically log movies and episodes when you finish watching
|
|||||||
msgstr "O Sofa registrará automaticamente filmes e episódios quando você terminar de assisti-los"
|
msgstr "O Sofa registrará automaticamente filmes e episódios quando você terminar de assisti-los"
|
||||||
|
|
||||||
#: apps/native/src/app/change-password.tsx:77
|
#: apps/native/src/app/change-password.tsx:77
|
||||||
#: apps/native/src/app/person/[id].tsx:169
|
#: apps/native/src/app/person/[id].tsx:254
|
||||||
#: apps/web/src/components/settings/account-section.tsx:391
|
#: apps/web/src/components/settings/account-section.tsx:391
|
||||||
#: apps/web/src/routes/__root.tsx:139
|
#: apps/web/src/routes/__root.tsx:139
|
||||||
msgid "Something went wrong"
|
msgid "Something went wrong"
|
||||||
msgstr "Algo deu errado"
|
msgstr "Algo deu errado"
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:113
|
#: apps/web/src/routes/_app/titles.$id.tsx:114
|
||||||
msgid "Something went wrong while loading this title. Please try again."
|
msgid "Something went wrong while loading this title. Please try again."
|
||||||
msgstr "Algo deu errado ao carregar este título. Tente novamente."
|
msgstr "Algo deu errado ao carregar este título. Tente novamente."
|
||||||
|
|
||||||
@@ -2070,7 +2102,7 @@ msgstr "Iniciando às"
|
|||||||
msgid "Starting import..."
|
msgid "Starting import..."
|
||||||
msgstr "Iniciando importação..."
|
msgstr "Iniciando importação..."
|
||||||
|
|
||||||
#: apps/native/src/hooks/use-title-actions.ts:64
|
#: apps/native/src/hooks/use-title-actions.ts:62
|
||||||
msgid "Status updated"
|
msgid "Status updated"
|
||||||
msgstr "Status atualizado"
|
msgstr "Status atualizado"
|
||||||
|
|
||||||
@@ -2095,11 +2127,11 @@ msgstr "Mudar para {0}"
|
|||||||
msgid "The page you're looking for doesn't exist."
|
msgid "The page you're looking for doesn't exist."
|
||||||
msgstr "A página que você está procurando não existe."
|
msgstr "A página que você está procurando não existe."
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/people.$id.tsx:53
|
#: apps/web/src/routes/_app/people.$id.tsx:55
|
||||||
msgid "The person you're looking for doesn't exist or may have been removed from the database."
|
msgid "The person you're looking for doesn't exist or may have been removed from the database."
|
||||||
msgstr "A pessoa que você está procurando não existe ou pode ter sido removida do banco de dados."
|
msgstr "A pessoa que você está procurando não existe ou pode ter sido removida do banco de dados."
|
||||||
|
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:142
|
#: apps/web/src/routes/_app/titles.$id.tsx:143
|
||||||
msgid "The title you're looking for doesn't exist or may have been removed from the database."
|
msgid "The title you're looking for doesn't exist or may have been removed from the database."
|
||||||
msgstr "O título que você está procurando não existe ou pode ter sido removido do banco de dados."
|
msgstr "O título que você está procurando não existe ou pode ter sido removido do banco de dados."
|
||||||
|
|
||||||
@@ -2109,7 +2141,7 @@ msgstr "Isso pode levar alguns minutos para bibliotecas grandes. Por favor, não
|
|||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:89
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:89
|
||||||
msgid "this month"
|
msgid "this month"
|
||||||
msgstr ""
|
msgstr "este mês"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:31
|
#: apps/native/src/components/dashboard/stats-card.tsx:31
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:135
|
#: apps/web/src/components/dashboard/stats-display.tsx:135
|
||||||
@@ -2121,14 +2153,19 @@ msgid "This page was left on the cutting room floor. It may have been moved, rem
|
|||||||
msgstr "Esta página ficou no chão da sala de montagem. Pode ter sido movida, removida ou nunca ter passado do roteiro."
|
msgstr "Esta página ficou no chão da sala de montagem. Pode ter sido movida, removida ou nunca ter passado do roteiro."
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(settings)/index.tsx:559
|
#: apps/native/src/app/(tabs)/(settings)/index.tsx:559
|
||||||
#: apps/web/src/routes/_app/settings.tsx:112
|
#: apps/web/src/routes/_app/settings.tsx:114
|
||||||
#: apps/web/src/routes/setup.tsx:180
|
#: apps/web/src/routes/setup.tsx:181
|
||||||
msgid "This product uses the TMDB API but is not endorsed or certified by TMDB."
|
msgid "This product uses the TMDB API but is not endorsed or certified by TMDB."
|
||||||
msgstr "Este produto usa a API do TMDB, mas não é endossado ou certificado pelo TMDB."
|
msgstr "Este produto usa a API do TMDB, mas não é endossado ou certificado pelo TMDB."
|
||||||
|
|
||||||
|
#: apps/native/src/components/titles/status-action-button.tsx:102
|
||||||
|
#: apps/web/src/components/titles/status-button.tsx:123
|
||||||
|
msgid "This title will be removed from your library. Your watch history and ratings will be kept."
|
||||||
|
msgstr "Este título será removido da sua biblioteca. O seu histórico de visualizações e avaliações serão mantidos."
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:88
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:88
|
||||||
msgid "this week"
|
msgid "this week"
|
||||||
msgstr ""
|
msgstr "esta semana"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:30
|
#: apps/native/src/components/dashboard/stats-card.tsx:30
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:134
|
#: apps/web/src/components/dashboard/stats-display.tsx:134
|
||||||
@@ -2147,7 +2184,7 @@ msgstr "Isso excluirá todos os títulos stub não enriquecidos e todas as image
|
|||||||
msgid "This will delete un-enriched stub titles that aren't in any user's library and clean up orphaned person records. Deleted titles will be re-imported if accessed again."
|
msgid "This will delete un-enriched stub titles that aren't in any user's library and clean up orphaned person records. Deleted titles will be re-imported if accessed again."
|
||||||
msgstr "Isso excluirá títulos stub não enriquecidos que não estão na biblioteca de nenhum usuário e limpará registros de pessoas órfãs. Os títulos excluídos serão reimportados se acessados novamente."
|
msgstr "Isso excluirá títulos stub não enriquecidos que não estão na biblioteca de nenhum usuário e limpará registros de pessoas órfãs. Os títulos excluídos serão reimportados se acessados novamente."
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:124
|
#: apps/native/src/components/settings/integration-card.tsx:133
|
||||||
msgid "This will invalidate the current {label} URL. You'll need to update it in {label}."
|
msgid "This will invalidate the current {label} URL. You'll need to update it in {label}."
|
||||||
msgstr "Isso invalidará a URL atual do {label}. Você precisará atualizá-la no {label}."
|
msgstr "Isso invalidará a URL atual do {label}. Você precisará atualizá-la no {label}."
|
||||||
|
|
||||||
@@ -2171,7 +2208,7 @@ msgstr "Isso substituirá todo o seu banco de dados pelo arquivo enviado. Um bac
|
|||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:90
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:90
|
||||||
msgid "this year"
|
msgid "this year"
|
||||||
msgstr ""
|
msgstr "este ano"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:32
|
#: apps/native/src/components/dashboard/stats-card.tsx:32
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:136
|
#: apps/web/src/components/dashboard/stats-display.tsx:136
|
||||||
@@ -2187,7 +2224,7 @@ msgid "Time:"
|
|||||||
msgstr "Hora:"
|
msgstr "Hora:"
|
||||||
|
|
||||||
#: apps/native/src/app/title/[id].tsx:231
|
#: apps/native/src/app/title/[id].tsx:231
|
||||||
#: apps/web/src/routes/_app/titles.$id.tsx:139
|
#: apps/web/src/routes/_app/titles.$id.tsx:140
|
||||||
msgid "Title not found"
|
msgid "Title not found"
|
||||||
msgstr "Título não encontrado"
|
msgstr "Título não encontrado"
|
||||||
|
|
||||||
@@ -2203,7 +2240,7 @@ msgstr "Os títulos na sua lista de desejos do Sofa serão automaticamente adici
|
|||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(home)/index.tsx:87
|
#: apps/native/src/app/(tabs)/(home)/index.tsx:87
|
||||||
msgid "today"
|
msgid "today"
|
||||||
msgstr ""
|
msgstr "hoje"
|
||||||
|
|
||||||
#: apps/native/src/components/dashboard/stats-card.tsx:29
|
#: apps/native/src/components/dashboard/stats-card.tsx:29
|
||||||
#: apps/web/src/components/dashboard/stats-display.tsx:133
|
#: apps/web/src/components/dashboard/stats-display.tsx:133
|
||||||
@@ -2229,14 +2266,14 @@ msgstr "Acompanhe o que você assiste. Saiba o que vem a seguir.<0/>Sua bibliote
|
|||||||
#: apps/web/src/components/titles/trailer-dialog.tsx:38
|
#: apps/web/src/components/titles/trailer-dialog.tsx:38
|
||||||
#: apps/web/src/components/titles/trailer-dialog.tsx:42
|
#: apps/web/src/components/titles/trailer-dialog.tsx:42
|
||||||
msgid "Trailer"
|
msgid "Trailer"
|
||||||
msgstr ""
|
msgstr "Trailer"
|
||||||
|
|
||||||
#: apps/web/src/components/explore/hero-banner.tsx:70
|
#: apps/web/src/components/explore/hero-banner.tsx:70
|
||||||
msgid "Trending today"
|
msgid "Trending today"
|
||||||
msgstr "Em alta hoje"
|
msgstr "Em alta hoje"
|
||||||
|
|
||||||
#: apps/native/src/app/(tabs)/(explore)/index.tsx:77
|
#: apps/native/src/app/(tabs)/(explore)/index.tsx:77
|
||||||
#: apps/web/src/routes/_app/explore.tsx:129
|
#: apps/web/src/routes/_app/explore.tsx:131
|
||||||
msgid "Trending Today"
|
msgid "Trending Today"
|
||||||
msgstr "Em Alta Hoje"
|
msgstr "Em Alta Hoje"
|
||||||
|
|
||||||
@@ -2291,11 +2328,11 @@ msgid "Unwatch all"
|
|||||||
msgstr "Desmarcar todos"
|
msgstr "Desmarcar todos"
|
||||||
|
|
||||||
#. placeholder {0}: season.name ?? t`Season ${season.seasonNumber}`
|
#. placeholder {0}: season.name ?? t`Season ${season.seasonNumber}`
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:313
|
#: apps/web/src/components/titles/use-title-actions.ts:305
|
||||||
msgid "Unwatched all of {0}"
|
msgid "Unwatched all of {0}"
|
||||||
msgstr "Desmarcados todos os episódios de {0}"
|
msgstr "Desmarcados todos os episódios de {0}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:156
|
#: apps/web/src/components/titles/use-title-actions.ts:154
|
||||||
msgid "Unwatched S{seasonNum} E{epNum}"
|
msgid "Unwatched S{seasonNum} E{epNum}"
|
||||||
msgstr "Desmarcado T{seasonNum} E{epNum}"
|
msgstr "Desmarcado T{seasonNum} E{epNum}"
|
||||||
|
|
||||||
@@ -2366,7 +2403,7 @@ msgstr "Enviar foto"
|
|||||||
msgid "Upload profile picture"
|
msgid "Upload profile picture"
|
||||||
msgstr "Enviar foto de perfil"
|
msgstr "Enviar foto de perfil"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-card.tsx:117
|
#: apps/native/src/components/settings/integration-card.tsx:125
|
||||||
msgid "URL copied to clipboard"
|
msgid "URL copied to clipboard"
|
||||||
msgstr "URL copiada para a área de transferência"
|
msgstr "URL copiada para a área de transferência"
|
||||||
|
|
||||||
@@ -2399,36 +2436,36 @@ msgstr "Histórico de exibição"
|
|||||||
msgid "Watch on {name}"
|
msgid "Watch on {name}"
|
||||||
msgstr "Assistir em {name}"
|
msgstr "Assistir em {name}"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:277
|
#: apps/web/src/components/titles/use-title-actions.ts:269
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:286
|
#: apps/web/src/components/titles/use-title-actions.ts:278
|
||||||
msgid "Watched all of {seasonLabel}"
|
msgid "Watched all of {seasonLabel}"
|
||||||
msgstr "Todos os episódios de {seasonLabel} assistidos"
|
msgstr "Todos os episódios de {seasonLabel} assistidos"
|
||||||
|
|
||||||
#: apps/native/src/lib/title-actions.ts:119
|
#: apps/native/src/lib/title-actions.ts:109
|
||||||
msgid "Watched all of {seasonName}"
|
msgid "Watched all of {seasonName}"
|
||||||
msgstr "Todos os episódios de {seasonName} assistidos"
|
msgstr "Todos os episódios de {seasonName} assistidos"
|
||||||
|
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:199
|
#: apps/web/src/components/titles/use-title-actions.ts:197
|
||||||
#: apps/web/src/components/titles/use-title-actions.ts:208
|
#: apps/web/src/components/titles/use-title-actions.ts:206
|
||||||
msgid "Watched S{seasonNum} E{epNum}"
|
msgid "Watched S{seasonNum} E{epNum}"
|
||||||
msgstr "Assistido T{seasonNum} E{epNum}"
|
msgstr "Assistido T{seasonNum} E{epNum}"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:43
|
#: apps/native/src/components/titles/status-action-button.tsx:48
|
||||||
#: apps/web/src/components/title-card.tsx:69
|
#: apps/web/src/components/title-card.tsx:69
|
||||||
#: apps/web/src/components/titles/status-button.tsx:14
|
#: apps/web/src/components/titles/status-button.tsx:47
|
||||||
msgid "Watching"
|
msgid "Watching"
|
||||||
msgstr "Assistindo"
|
msgstr "Assistindo"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:78
|
#: apps/native/src/components/titles/status-action-button.tsx:85
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:743
|
#: apps/web/src/components/settings/imports-section.tsx:743
|
||||||
#: apps/web/src/components/settings/imports-section.tsx:769
|
#: apps/web/src/components/settings/imports-section.tsx:769
|
||||||
#: apps/web/src/components/titles/status-button.tsx:49
|
#: apps/web/src/components/titles/status-button.tsx:82
|
||||||
msgid "Watchlist"
|
msgid "Watchlist"
|
||||||
msgstr "Lista de Desejos"
|
msgstr "Lista de Desejos"
|
||||||
|
|
||||||
#: apps/native/src/components/titles/status-action-button.tsx:41
|
#: apps/native/src/components/titles/status-action-button.tsx:41
|
||||||
msgid "Watchlisted"
|
#~ msgid "Watchlisted"
|
||||||
msgstr "Na Lista de Desejos"
|
#~ msgstr "Na Lista de Desejos"
|
||||||
|
|
||||||
#: apps/native/src/components/settings/integration-configs.ts:51
|
#: apps/native/src/components/settings/integration-configs.ts:51
|
||||||
#: apps/native/src/components/settings/integration-configs.ts:66
|
#: apps/native/src/components/settings/integration-configs.ts:66
|
||||||
@@ -2458,7 +2495,7 @@ msgstr "Onde Assistir"
|
|||||||
msgid "With Ads"
|
msgid "With Ads"
|
||||||
msgstr "Com Anúncios"
|
msgstr "Com Anúncios"
|
||||||
|
|
||||||
#: apps/native/src/app/person/[id].tsx:52
|
#: apps/native/src/app/person/[id].tsx:140
|
||||||
#: apps/native/src/components/search/recently-viewed-row-content.tsx:30
|
#: apps/native/src/components/search/recently-viewed-row-content.tsx:30
|
||||||
#: apps/web/src/components/people/person-hero.tsx:73
|
#: apps/web/src/components/people/person-hero.tsx:73
|
||||||
msgid "Writer"
|
msgid "Writer"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user