New Crowdin translations by GitHub Action

This commit is contained in:
Crowdin Bot authored and Jake Jarvis committed 2026-03-23 16:35:24 -04:00
1 parent eb9c7ae6df
commit fe8c652b4a
11 files changed
+3242 -448

No files matched your search

+296 -42
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: ar\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:52\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
@@ -37,6 +37,11 @@ msgstr "{0, plural, zero {# صور} one {# صورة} two {# صورتين} few {#
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, zero {# عناوين} one {# عنوان} two {# عنوانين} few {# عناوين} many {# عنوان} other {# عنوان}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, zero {# عناوين} one {# عنوان} two {# عنواني
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr "{backupCount, plural, zero {# نسخ احتياطية} one {# نسخة احتياطية} two {# نسختين احتياطيتين} few {# نسخ احتياطية} many {# نسخة احتياطية} other {# نسخة احتياطية}} مخزنة"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
msgstr "{backupCount} نسخ احتياطية · آخر <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr "{cachedImageCount} صور مخزنة مؤقتًا"
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr "{count, plural, zero {# حلقات سابقة} one {# حلقة سابقة} two {# حلقتين سابقتين} few {# حلقات سابقة} many {# حلقة سابقة} other {# حلقة سابقة}} غير مشاهدة"
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr "{count} حلق{suffix}"
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -156,21 +173,29 @@ msgstr "{movieCount} فيلم، {episodeCount} حلقة"
msgid "{ratingCount} ratings"
msgstr "{ratingCount} تقييم"
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr "{unresolvedCount} عنصر لا يحتوي على معرّفات خارجية وسيتم البحث عنه بالعنوان، مما قد يكون أقل دقة."
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total} حلقة"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr "{watchedCount} من أصل {episodeCount} حلقة مشاهدة"
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr "{watchedCount} من أصل {episodeCount} حلقة مشاهدة"
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr "{watchedCount}/{episodeCount, plural, zero {# حلقات} one {# حلقة} two {# حلقتين} few {# حلقات} many {# حلقة} other {# حلقة}}"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr "{watchedEpisodes}/{totalEpisodes, plural, zero {# حلقات} one {# حلقة} two {# حلقتين} few {# حلقات} many {# حلقة} other {# حلقة}}"
@@ -198,6 +225,10 @@ msgstr "{watchlistCount} عناصر"
msgid "Account"
msgstr "الحساب"
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr "الإجراءات"
@@ -221,15 +252,20 @@ msgstr "أضف <0>Generic Destination</0> والصق الرابط أعلاه"
msgid "Add a new webhook and paste the URL above"
msgstr "أضف webhook جديداً والصق الرابط أعلاه"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "إضافة إلى المكتبة"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "إضافة إلى قائمة المشاهدة"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "هل لديك حساب بالفعل؟ تسجيل الدخول"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "حدث خطأ غير متوقع أثناء تحميل هذه الصفحة. يمكنك المحاولة مرة أخرى أو العودة إلى لوحة التحكم."
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "الإبلاغ المجهول عن الاستخدام"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr "تم اللحاق — تم تحديد {count, plural, zero {# حلقات} one {# حلقة} two {# حلقتين} few {# حلقات} many {# حلقة} other {# حلقة}} كمشاهدة"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "تغيير كلمة المرور"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "تغيير كلمة المرور"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "تغيير الخادم"
msgid "Check configuration"
msgstr "التحقق من الإعداد"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "التحقق من التحديثات"
@@ -530,6 +569,7 @@ msgstr "إغلاق"
msgid "Completed"
msgstr "مكتمل"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "تعذر تحميل تفاصيل الشخص"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "إنشاء حساب"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "إنشاء حساب"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "إنشاء حسابك"
msgid "Creating…"
msgstr "جارٍ الإنشاء…"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "كلمة المرور الحالية"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "كلمة المرور الحالية مطلوبة"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "منطقة الخطر"
@@ -732,6 +784,10 @@ msgstr "قطع الاتصال"
msgid "Disconnect {label}"
msgstr "قطع الاتصال بـ {label}"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "ليس لديك خادم؟"
@@ -745,6 +801,10 @@ msgstr "ليس لديك حساب؟"
msgid "Done"
msgstr "تم"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "انقر مرتين لمسح هذا الفلتر"
@@ -753,6 +813,10 @@ msgstr "انقر مرتين لمسح هذا الفلتر"
msgid "Double tap to filter by {label}"
msgstr "انقر مرتين للتصفية بـ {label}"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "تنزيل النسخة الاحتياطية"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr "محرر"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr "البريد الإلكتروني"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "فعّل نوع الإشعار \"Playback Stop\""
@@ -794,10 +869,19 @@ msgstr "فعّل نوع الإشعار <0>Playback Stop</0>"
msgid "Enable the <0>Playback</0> event category"
msgstr "فعّل فئة الحدث <0>Playback</0>"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "أدخل الرمز أدناه على موقع {source} لتفويض Sofa."
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "أدخل كلمة مرورك الحالية واختر كلمة مرور جديدة."
@@ -828,11 +912,13 @@ msgstr "الحلقة {episodeNumber}"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "الحلقة {episodeNumber}، {episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "تم إلغاء مشاهدة الحلقة"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr "خطأ"
msgid "Errors ({errorCount})"
msgstr "الأخطاء ({errorCount})"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "فشل قطع الاتصال بـ {label}"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "فشل تحميل إعدادات جدول النسخ الاحتياطي."
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "فشل تسجيل الدخول"
msgid "Failed to start {sourceLabel} connection"
msgstr "فشل بدء الاتصال بـ {sourceLabel}"
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "فشل تشغيل المهمة"
@@ -1156,14 +1254,15 @@ msgstr "إليك ما يحدث في مكتبتك"
msgid "Home"
msgstr "الرئيسية"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "ذاكرة التخزين المؤقت للصور"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "ذاكرة التخزين المؤقت للصور"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "جارٍ الاستيراد من {source}"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "في المكتبة"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "في المكتبة"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "في قائمة المشاهدة"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1346,7 +1446,7 @@ msgstr "نجح آخر تشغيل"
#: apps/web/src/components/settings/account-section.tsx
msgid "Library"
msgstr ""
msgstr "المكتبة"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Library refresh"
@@ -1356,10 +1456,19 @@ msgstr "تحديث المكتبة"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "جارٍ التحميل…"
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "تحديد الكل كمشاهدة"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "تحديد كمشاهدة"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "تحديد كمشاهدة"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "تم تحديد جميع حلقات \"{titleName}\" كمشاهدة"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "تم التحديد كمشاهدة"
msgid "Member since {memberSince}"
msgstr "عضو منذ {memberSince}"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "الاثنين"
@@ -1490,11 +1614,20 @@ msgstr "أفلام {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr "الاسم"
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "لا يتم قبول حسابات جديدة في الوقت الحال
msgid "New backup"
msgstr "نسخة احتياطية جديدة"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "الحلقة التالية"
msgid "Next run"
msgstr "التشغيل التالي"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "غير مُهيَّأ"
msgid "Not Found"
msgstr "غير موجود"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "في قائمة المشاهدة"
@@ -1639,6 +1779,7 @@ msgstr "افتح Radarr، وانتقل إلى <0>الإعدادات > Import Lis
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "افتح Radarr، وانتقل إلى الإعدادات > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "افتح Sonarr، وانتقل إلى <0>الإعدادات > Import Lis
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "افتح Sonarr، وانتقل إلى الإعدادات > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "أو"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "أو"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "جارٍ التحليل..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr "كلمة المرور"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "تم تحديث كلمة المرور"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "كلمتا المرور غير متطابقتين"
@@ -1716,6 +1882,14 @@ msgstr "الشخص غير موجود"
msgid "Play trailer"
msgstr "تشغيل الإعلان"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "المسلسلات الشائعة"
msgid "Pre-restore backup"
msgstr "نسخة احتياطية قبل الاستعادة"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "الإجراءات السريعة"
msgid "Radarr List URL"
msgstr "رابط قائمة Radarr"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "تم التقييم بـ {stars, plural, zero {# نجمة} one {# نجم
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "التقييم"
@@ -1836,6 +2020,10 @@ msgstr "التقييم"
msgid "Rating removed"
msgstr "تم حذف التقييم"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "تم إغلاق التسجيل"
msgid "Registration Closed"
msgstr "التسجيل مغلق"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "تم فتح التسجيل"
msgid "Remove"
msgstr "إزالة"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "إزالة من المكتبة"
@@ -1939,14 +2134,18 @@ msgstr "إزالة من المكتبة"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "إزالة من المكتبة"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "إزالة من المكتبة؟"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "إزالة الصورة"
@@ -2133,6 +2332,10 @@ msgstr "بحث…"
msgid "Season {seasonNumber}"
msgstr "الموسم {seasonNumber}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr "الخادم"
msgid "Server Health"
msgstr "صحة الخادم"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "رابط الخادم"
@@ -2188,6 +2392,7 @@ msgstr "حدد ملف تعريف الجودة المفضل والمجلد الج
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "الإعدادات"
@@ -2212,15 +2417,17 @@ msgstr "عرض أقل"
msgid "Show more"
msgstr "عرض المزيد"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "تسجيل الدخول"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "تسجيل الدخول"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr "تسجيل الدخول باستخدام {providerName}"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "تسجيل الخروج"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "تسجيل الخروج"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "سيقوم Sofa تلقائياً بتسجيل الأفلام والحل
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "حدث خطأ ما…"
msgid "Sonarr List URL"
msgstr "رابط قائمة Sonarr"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "ابدأ الاستكشاف"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr "إعلان"
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "رائج اليوم"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "رائج اليوم"
@@ -2554,6 +2772,10 @@ msgstr "غير معروف"
msgid "unlimited"
msgstr "غير محدود"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "غير قابل للوصول"
@@ -2578,6 +2800,10 @@ msgstr "تم إلغاء مشاهدة كل {seasonLabel}"
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "تم إلغاء مشاهدة م{seasonNum} ح{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "تم تفعيل التحقق من التحديثات"
msgid "Update failed"
msgstr "فشل التحديث"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "تحديث كلمة المرور"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "تحديث كلمة المرور"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "رفع صورة الملف الشخصي"
msgid "URL copied to clipboard"
msgstr "تم نسخ الرابط إلى الحافظة"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "عرض الإصدار"
@@ -2699,20 +2938,26 @@ msgstr "سجل المشاهدة"
msgid "Watch on {name}"
msgstr "مشاهدة على {name}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "تمت مشاهدة كل {seasonLabel}"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "تمت مشاهدة كل {seasonName}"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "تمت مشاهدة م{seasonNum} ح{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr "رابط Webhook"
msgid "Wednesday"
msgstr "الأربعاء"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "مكتبتك فارغة"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "اسمك"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""
+294 -40
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: de\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:53\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -37,6 +37,11 @@ msgstr "{0, plural, one {# Bild} other {# Bilder}}"
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, one {# Titel} other {# Titel}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, one {# Titel} other {# Titel}}"
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr ""
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr ""
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -156,21 +173,29 @@ msgstr ""
msgid "{ratingCount} ratings"
msgstr ""
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr ""
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total} Episoden"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr ""
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr ""
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr ""
@@ -198,6 +225,10 @@ msgstr ""
msgid "Account"
msgstr "Konto"
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr "Aktionen"
@@ -221,15 +252,20 @@ msgstr "Füge ein <0>Generic Destination</0> hinzu und füge die URL oben ein"
msgid "Add a new webhook and paste the URL above"
msgstr "Füge einen neuen Webhook hinzu und füge die URL oben ein"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "Zur Bibliothek hinzufügen"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "Zur Merkliste hinzufügen"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "Bereits ein Konto? Anmelden"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "Beim Laden dieser Seite ist ein unerwarteter Fehler aufgetreten. Du kannst es erneut versuchen oder zum Dashboard zurückkehren."
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "Anonyme Nutzungsberichte"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "Passwort ändern"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "Passwort ändern"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "Server wechseln"
msgid "Check configuration"
msgstr "Konfiguration prüfen"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "Nach Updates suchen"
@@ -530,6 +569,7 @@ msgstr "Schließen"
msgid "Completed"
msgstr "Abgeschlossen"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "Personendetails konnten nicht geladen werden"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "Konto erstellen"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "Konto erstellen"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "Erstelle dein Konto"
msgid "Creating…"
msgstr "Erstelle..."
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "Aktuelles Passwort"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "Aktuelles Passwort ist erforderlich"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "Gefahrenzone"
@@ -732,6 +784,10 @@ msgstr "Trennen"
msgid "Disconnect {label}"
msgstr "{label} trennen"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "Noch keinen Server?"
@@ -745,6 +801,10 @@ msgstr "Noch kein Konto?"
msgid "Done"
msgstr "Fertig"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "Doppeltippen zum Entfernen dieses Filters"
@@ -753,6 +813,10 @@ msgstr "Doppeltippen zum Entfernen dieses Filters"
msgid "Double tap to filter by {label}"
msgstr "Doppeltippen zum Filtern nach {label}"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "Backup herunterladen"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr "Cutter"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr "E-Mail"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "Benachrichtigungstyp \"Playback Stop\" aktivieren"
@@ -794,10 +869,19 @@ msgstr "Benachrichtigungstyp <0>Playback Stop</0> aktivieren"
msgid "Enable the <0>Playback</0> event category"
msgstr "Ereigniskategorie <0>Playback</0> aktivieren"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "Gib den untenstehenden Code auf der Website von {source} ein, um Sofa zu autorisieren."
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "Gib dein aktuelles Passwort ein und wähle ein neues."
@@ -828,11 +912,13 @@ msgstr "Folge {episodeNumber}"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "Folge {episodeNumber}, {episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "Episode als ungesehen markiert"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr "Fehler"
msgid "Errors ({errorCount})"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "{label} konnte nicht getrennt werden"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "Backup-Zeitplaneinstellungen konnten nicht geladen werden."
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "Anmeldung fehlgeschlagen"
msgid "Failed to start {sourceLabel} connection"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "Aufgabe konnte nicht ausgelöst werden"
@@ -1156,14 +1254,15 @@ msgstr "Das passiert in deiner Bibliothek"
msgid "Home"
msgstr "Startseite"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "Bild-Cache"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "Bild-Cache"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "Importiere von {source}"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "In Bibliothek"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "In Bibliothek"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "In der Merkliste"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1356,10 +1456,19 @@ msgstr "Bibliothek aktualisieren"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "Lade..."
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "Alle als gesehen markieren"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "Als gesehen markieren"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "Als gesehen markieren"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "Alle Folgen von \"{titleName}\" als gesehen markiert"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "Als gesehen markiert"
msgid "Member since {memberSince}"
msgstr "Mitglied seit {memberSince}"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "Montag"
@@ -1490,11 +1614,20 @@ msgstr "Filme {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "Neue Konten werden derzeit nicht akzeptiert. Kontaktiere den Admin, wenn
msgid "New backup"
msgstr "Neues Backup"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "Nächste Episode"
msgid "Next run"
msgstr "Nächster Lauf"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "Nicht konfiguriert"
msgid "Not Found"
msgstr "Nicht gefunden"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "Auf der Merkliste"
@@ -1639,6 +1779,7 @@ msgstr "Öffne Radarr, gehe zu <0>Settings > Import Lists</0>"
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "Öffne Radarr, gehe zu Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "Öffne Sonarr, gehe zu <0>Settings > Import Lists</0>"
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "Öffne Sonarr, gehe zu Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "oder"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "ODER"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "Verarbeite..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr "Passwort"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "Passwort aktualisiert"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "Passwörter stimmen nicht überein"
@@ -1716,6 +1882,14 @@ msgstr "Person nicht gefunden"
msgid "Play trailer"
msgstr "Trailer abspielen"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "Beliebte Serien"
msgid "Pre-restore backup"
msgstr "Backup vor Wiederherstellung"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "Schnellaktionen"
msgid "Radarr List URL"
msgstr "Radarr-Listen-URL"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "{stars, plural, one {# Stern} other {# Sterne}} vergeben"
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "Bewertung"
@@ -1836,6 +2020,10 @@ msgstr "Bewertung"
msgid "Rating removed"
msgstr "Bewertung entfernt"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "Registrierung geschlossen"
msgid "Registration Closed"
msgstr "Registrierung geschlossen"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "Registrierung geöffnet"
msgid "Remove"
msgstr "Entfernen"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "Aus Bibliothek entfernen"
@@ -1939,14 +2134,18 @@ msgstr "Aus Bibliothek entfernen"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "Aus Bibliothek entfernen"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "Aus der Bibliothek entfernen?"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "Foto entfernen"
@@ -2133,6 +2332,10 @@ msgstr "Suchen..."
msgid "Season {seasonNumber}"
msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr ""
msgid "Server Health"
msgstr "Server-Status"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "Server-URL"
@@ -2188,6 +2392,7 @@ msgstr "Bevorzugtes Qualitätsprofil und Stammordner festlegen"
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "Einstellungen"
@@ -2212,15 +2417,17 @@ msgstr "Weniger anzeigen"
msgid "Show more"
msgstr "Mehr anzeigen"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "Anmelden"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "Anmelden"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "Abmelden"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "Abmelden"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "Sofa protokolliert Filme und Episoden automatisch, wenn du sie zu Ende g
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "Etwas ist schiefgelaufen..."
msgid "Sonarr List URL"
msgstr "Sonarr-Listen-URL"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "Jetzt entdecken"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "Heute im Trend"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "Heute im Trend"
@@ -2554,6 +2772,10 @@ msgstr "unbekannt"
msgid "unlimited"
msgstr "unbegrenzt"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "Nicht erreichbar"
@@ -2578,6 +2800,10 @@ msgstr ""
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "S{seasonNum} E{epNum} als ungesehen markiert"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "Update-Prüfung aktiviert"
msgid "Update failed"
msgstr "Aktualisierung fehlgeschlagen"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "Passwort aktualisieren"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "Passwort aktualisieren"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "Profilbild hochladen"
msgid "URL copied to clipboard"
msgstr "URL in die Zwischenablage kopiert"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "Version ansehen"
@@ -2699,20 +2938,26 @@ msgstr "Verlauf"
msgid "Watch on {name}"
msgstr "Ansehen auf {name}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "Alle Episoden von {seasonLabel} als gesehen markiert"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "Alle Episoden von {seasonName} als gesehen markiert"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "S{seasonNum} E{epNum} als gesehen markiert"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr "Webhook-URL"
msgid "Wednesday"
msgstr "Mittwoch"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "Deine Bibliothek ist leer"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "Dein Name"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""
+295 -41
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: es\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:53\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -37,6 +37,11 @@ msgstr "{0, plural, one {# imagen} other {# imágenes}}"
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, one {# título} other {# títulos}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, one {# título} other {# títulos}}"
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr ""
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr ""
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -129,7 +146,7 @@ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{jobLabel} triggered"
msgstr ""
msgstr "{jobLabel} iniciado"
#: apps/native/src/components/settings/integration-card.tsx
#: apps/web/src/components/settings/integration-card.tsx
@@ -156,21 +173,29 @@ msgstr ""
msgid "{ratingCount} ratings"
msgstr ""
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr ""
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total} episodios"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr ""
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr ""
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr ""
@@ -198,6 +225,10 @@ msgstr ""
msgid "Account"
msgstr "Cuenta"
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr "Acciones"
@@ -221,15 +252,20 @@ msgstr "Añade un <0>Generic Destination</0> y pega la URL anterior"
msgid "Add a new webhook and paste the URL above"
msgstr "Añade un nuevo webhook y pega la URL anterior"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "Añadir a la biblioteca"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "Añadir a la lista"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "¿Ya tienes una cuenta? Inicia sesión"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "Ocurrió un error inesperado al cargar esta página. Puedes intentarlo de nuevo o volver al panel."
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "Informe de uso anónimo"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "Cambiar contraseña"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "Cambiar contraseña"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "Cambiar servidor"
msgid "Check configuration"
msgstr "Comprobar configuración"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "Buscar actualizaciones"
@@ -530,6 +569,7 @@ msgstr "Cerrar"
msgid "Completed"
msgstr "Completado"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "No se pudieron cargar los detalles de la persona"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "Crear cuenta"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "Crear cuenta"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "Crea tu cuenta"
msgid "Creating…"
msgstr "Creando…"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "Contraseña actual"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "La contraseña actual es obligatoria"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "Zona de peligro"
@@ -732,6 +784,10 @@ msgstr "Desconectar"
msgid "Disconnect {label}"
msgstr "Desconectar {label}"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "¿No tienes un servidor?"
@@ -745,6 +801,10 @@ msgstr "¿No tienes una cuenta?"
msgid "Done"
msgstr "Hecho"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "Doble toque para eliminar este filtro"
@@ -753,6 +813,10 @@ msgstr "Doble toque para eliminar este filtro"
msgid "Double tap to filter by {label}"
msgstr "Doble toque para filtrar por {label}"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "Descargar copia de seguridad"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr "Correo electrónico"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "Activa el tipo de notificación \"Playback Stop\""
@@ -794,10 +869,19 @@ msgstr "Activa el tipo de notificación <0>Playback Stop</0>"
msgid "Enable the <0>Playback</0> event category"
msgstr "Activa la categoría de evento <0>Playback</0>"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "Introduce el siguiente código en el sitio web de {source} para autorizar a Sofa."
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "Introduce tu contraseña actual y elige una nueva."
@@ -828,11 +912,13 @@ msgstr "Episodio {episodeNumber}"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "Episodio {episodeNumber}, {episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "Episodio marcado como no visto"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr ""
msgid "Errors ({errorCount})"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "Error al desconectar {label}"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "Error al cargar los ajustes de programación de copias de seguridad."
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "Error al iniciar sesión"
msgid "Failed to start {sourceLabel} connection"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "Error al iniciar la tarea"
@@ -1156,14 +1254,15 @@ msgstr "Esto es lo que pasa con tu biblioteca"
msgid "Home"
msgstr "Inicio"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "Caché de imágenes"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "Caché de imágenes"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "Importando desde {source}"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "En la biblioteca"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "En la biblioteca"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "En lista de seguimiento"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1356,10 +1456,19 @@ msgstr "Actualización de biblioteca"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "Cargando…"
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "Marcar todos como vistos"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "Marcar como visto"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "Marcar como visto"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "Se marcaron todos los episodios de \"{titleName}\" como vistos"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "Marcado como visto"
msgid "Member since {memberSince}"
msgstr "Miembro desde {memberSince}"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "Lunes"
@@ -1490,11 +1614,20 @@ msgstr "Películas {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr "Nombre"
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "No se aceptan nuevas cuentas en este momento. Contacta al administrador
msgid "New backup"
msgstr "Nueva copia de seguridad"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "Siguiente episodio"
msgid "Next run"
msgstr "Próxima ejecución"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "No configurado"
msgid "Not Found"
msgstr "No encontrado"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "En la lista"
@@ -1639,6 +1779,7 @@ msgstr "Abre Radarr, ve a <0>Settings > Import Lists</0>"
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "Abre Radarr, ve a Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "Abre Sonarr, ve a <0>Settings > Import Lists</0>"
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "Abre Sonarr, ve a Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "o"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "O"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "Analizando..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr "Contraseña"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "Contraseña actualizada"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "Las contraseñas no coinciden"
@@ -1716,6 +1882,14 @@ msgstr "Persona no encontrada"
msgid "Play trailer"
msgstr "Reproducir tráiler"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "Series populares"
msgid "Pre-restore backup"
msgstr "Copia de seguridad previa a restauración"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "Acciones rápidas"
msgid "Radarr List URL"
msgstr "URL de lista de Radarr"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "Valorado con {stars, plural, one {# estrella} other {# estrellas}}"
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "Valoración"
@@ -1836,6 +2020,10 @@ msgstr "Valoración"
msgid "Rating removed"
msgstr "Valoración eliminada"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "Registro cerrado"
msgid "Registration Closed"
msgstr "Registro cerrado"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "Registro abierto"
msgid "Remove"
msgstr "Eliminar"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "Eliminar de la biblioteca"
@@ -1939,14 +2134,18 @@ msgstr "Eliminar de la biblioteca"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "Eliminar de la biblioteca"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "¿Eliminar de la biblioteca?"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "Eliminar foto"
@@ -2133,6 +2332,10 @@ msgstr "Buscar…"
msgid "Season {seasonNumber}"
msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr "Servidor"
msgid "Server Health"
msgstr "Estado del servidor"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "URL del servidor"
@@ -2188,6 +2392,7 @@ msgstr "Configura tu perfil de calidad y carpeta raíz preferidos"
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "Ajustes"
@@ -2212,15 +2417,17 @@ msgstr "Mostrar menos"
msgid "Show more"
msgstr "Mostrar más"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "Iniciar sesión"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "Iniciar sesión"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "Cerrar sesión"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "Cerrar sesión"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "Sofa registrará automáticamente películas y episodios cuando termines
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "Algo salió mal…"
msgid "Sonarr List URL"
msgstr "URL de lista de Sonarr"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "Empezar a explorar"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr "Tráiler"
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "Tendencia hoy"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "Tendencias hoy"
@@ -2554,6 +2772,10 @@ msgstr "desconocido"
msgid "unlimited"
msgstr "ilimitado"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "Inaccesible"
@@ -2578,6 +2800,10 @@ msgstr ""
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "No visto T{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "Comprobaciones de actualizaciones activadas"
msgid "Update failed"
msgstr "Error al actualizar"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "Actualizar contraseña"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "Actualizar contraseña"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "Subir foto de perfil"
msgid "URL copied to clipboard"
msgstr "URL copiada al portapapeles"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "Ver versión"
@@ -2699,20 +2938,26 @@ msgstr "Historial de visionado"
msgid "Watch on {name}"
msgstr "Ver en {name}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "Visto todo de {seasonLabel}"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "Visto todo de {seasonName}"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "Visto T{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr "URL de webhook"
msgid "Wednesday"
msgstr "Miércoles"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "Tu biblioteca está vacía"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "Tu nombre"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""
+294 -40
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: fr\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:52\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
@@ -37,6 +37,11 @@ msgstr ""
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, one {# titre} other {# titres}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, one {# titre} other {# titres}}"
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr ""
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr ""
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -156,21 +173,29 @@ msgstr ""
msgid "{ratingCount} ratings"
msgstr ""
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr ""
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total} épisodes"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr ""
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr ""
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr ""
@@ -198,6 +225,10 @@ msgstr ""
msgid "Account"
msgstr "Compte"
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr ""
@@ -221,15 +252,20 @@ msgstr "Ajoutez une <0>Generic Destination</0> et collez l'URL ci-dessus"
msgid "Add a new webhook and paste the URL above"
msgstr "Ajoutez un nouveau webhook et collez l'URL ci-dessus"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "Ajouter à la bibliothèque"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "Ajouter à la liste de suivi"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "Vous avez déjà un compte ? Se connecter"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "Une erreur inattendue s'est produite lors du chargement de cette page. Vous pouvez réessayer ou retourner au tableau de bord."
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "Rapports d'utilisation anonymes"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "Changer le mot de passe"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "Changer le mot de passe"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "Changer de serveur"
msgid "Check configuration"
msgstr "Vérifier la configuration"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "Rechercher des mises à jour"
@@ -530,6 +569,7 @@ msgstr "Fermer"
msgid "Completed"
msgstr "Terminé"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "Impossible de charger les détails de la personne"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "Créer un compte"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "Créer un compte"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "Créez votre compte"
msgid "Creating…"
msgstr "Création…"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "Mot de passe actuel"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "Le mot de passe actuel est requis"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "Zone de danger"
@@ -732,6 +784,10 @@ msgstr "Déconnecter"
msgid "Disconnect {label}"
msgstr "Déconnecter {label}"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "Pas de serveur ?"
@@ -745,6 +801,10 @@ msgstr "Pas encore de compte ?"
msgid "Done"
msgstr "Terminé"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "Double appui pour supprimer ce filtre"
@@ -753,6 +813,10 @@ msgstr "Double appui pour supprimer ce filtre"
msgid "Double tap to filter by {label}"
msgstr "Double appui pour filtrer par {label}"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "Télécharger la sauvegarde"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr "Monteur"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr "E-mail"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "Activez le type de notification « Playback Stop »"
@@ -794,10 +869,19 @@ msgstr "Activez le type de notification <0>Playback Stop</0>"
msgid "Enable the <0>Playback</0> event category"
msgstr "Activez la catégorie d'événement <0>Playback</0>"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "Entrez le code ci-dessous sur le site de {source} pour autoriser Sofa."
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "Entrez votre mot de passe actuel et choisissez-en un nouveau."
@@ -828,11 +912,13 @@ msgstr "Épisode {episodeNumber}"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "Épisode {episodeNumber}, {episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "Épisode non visionné"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr "Erreur"
msgid "Errors ({errorCount})"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "Échec de la déconnexion de {label}"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "Échec du chargement des paramètres de planning de sauvegarde."
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "Échec de la connexion"
msgid "Failed to start {sourceLabel} connection"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "Échec du déclenchement de la tâche"
@@ -1156,14 +1254,15 @@ msgstr "Voici ce qui se passe dans votre bibliothèque"
msgid "Home"
msgstr "Accueil"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "Cache d'images"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "Cache d'images"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "Importation depuis {source}"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "Dans la bibliothèque"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "Dans la bibliothèque"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "Dans la liste"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1356,10 +1456,19 @@ msgstr "Actualisation de la bibliothèque"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "Chargement…"
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "Tout marquer comme visionné"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "Marquer comme visionné"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "Marquer comme visionné"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "Tous les épisodes de \"{titleName}\" marqués comme vus"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "Marqué comme visionné"
msgid "Member since {memberSince}"
msgstr "Membre depuis {memberSince}"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "Lundi"
@@ -1490,11 +1614,20 @@ msgstr "Films {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr "Nom"
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "Les nouvelles inscriptions sont fermées. Contactez l'administrateur si
msgid "New backup"
msgstr "Nouvelle sauvegarde"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "Épisode suivant"
msgid "Next run"
msgstr "Prochaine exécution"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "Non configuré"
msgid "Not Found"
msgstr "Introuvable"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "Dans la liste de suivi"
@@ -1639,6 +1779,7 @@ msgstr "Ouvrez Radarr, allez dans <0>Settings > Import Lists</0>"
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "Ouvrez Radarr, allez dans Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "Ouvrez Sonarr, allez dans <0>Settings > Import Lists</0>"
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "Ouvrez Sonarr, allez dans Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "ou"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "OU"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "Analyse..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr "Mot de passe"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "Mot de passe mis à jour"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "Les mots de passe ne correspondent pas"
@@ -1716,6 +1882,14 @@ msgstr "Personne introuvable"
msgid "Play trailer"
msgstr "Lire la bande-annonce"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "Séries populaires"
msgid "Pre-restore backup"
msgstr "Sauvegarde pré-restauration"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "Actions rapides"
msgid "Radarr List URL"
msgstr "URL de liste Radarr"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "Noté {stars, plural, one {# étoile} other {# étoiles}}"
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "Note"
@@ -1836,6 +2020,10 @@ msgstr "Note"
msgid "Rating removed"
msgstr "Note supprimée"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "Inscriptions fermées"
msgid "Registration Closed"
msgstr "Inscriptions fermées"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "Inscriptions ouvertes"
msgid "Remove"
msgstr "Supprimer"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "Supprimer de la bibliothèque"
@@ -1939,14 +2134,18 @@ msgstr "Supprimer de la bibliothèque"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "Supprimer de la bibliothèque"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "Retirer de la bibliothèque ?"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "Supprimer la photo"
@@ -2133,6 +2332,10 @@ msgstr "Rechercher…"
msgid "Season {seasonNumber}"
msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr "Serveur"
msgid "Server Health"
msgstr "État du serveur"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "URL du serveur"
@@ -2188,6 +2392,7 @@ msgstr "Définissez votre profil de qualité et dossier racine préférés"
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "Paramètres"
@@ -2212,15 +2417,17 @@ msgstr "Afficher moins"
msgid "Show more"
msgstr "Afficher plus"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "Se connecter"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "Se connecter"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "Se déconnecter"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "Se déconnecter"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "Sofa enregistrera automatiquement les films et épisodes lorsque vous au
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "Une erreur s'est produite…"
msgid "Sonarr List URL"
msgstr "URL de liste Sonarr"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "Commencer à explorer"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr "Bande-annonce"
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "Tendance aujourd'hui"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "Tendances du jour"
@@ -2554,6 +2772,10 @@ msgstr "inconnu"
msgid "unlimited"
msgstr "illimité"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "Inaccessible"
@@ -2578,6 +2800,10 @@ msgstr ""
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "Démarqué S{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "Vérifications des mises à jour activées"
msgid "Update failed"
msgstr "Mise à jour échouée"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "Mettre à jour le mot de passe"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "Mettre à jour le mot de passe"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "Télécharger une photo de profil"
msgid "URL copied to clipboard"
msgstr "URL copiée dans le presse-papiers"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "Voir la version"
@@ -2699,20 +2938,26 @@ msgstr "Historique de visionnage"
msgid "Watch on {name}"
msgstr "Regarder sur {name}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "Tout visionné de {seasonLabel}"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "Tout visionné de {seasonName}"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "Visionné S{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr "URL de webhook"
msgid "Wednesday"
msgstr "Mercredi"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "Votre bibliothèque est vide"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "Votre nom"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""
+295 -41
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: he\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:53\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: Hebrew\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
@@ -37,6 +37,11 @@ msgstr "{0, plural, one {# תמונה} two {# תמונות} many {# תמונות
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, one {# כותרת} two {# כותרות} many {# כותרות} other {# כותרות}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, one {# כותרת} two {# כותרות} many {# כותרות
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr "{backupCount, plural, one {# גיבוי שמור} two {# גיבויים שמורים} many {# גיבויים שמורים} other {# גיבויים שמורים}}"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
msgstr "{backupCount} גיבויים · אחרון <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr "{cachedImageCount} תמונות במטמון"
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr "{count, plural, one {# פרק קודם לא נצפה} two {# פרקים קודמים לא נצפו} many {# פרקים קודמים לא נצפו} other {# פרקים קודמים לא נצפו}}"
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr "{count} פרק{suffix}"
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -156,21 +173,29 @@ msgstr "{movieCount} סרטים, {episodeCount} פרקים"
msgid "{ratingCount} ratings"
msgstr "{ratingCount} דירוגים"
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr "ל-{unresolvedCount} פריטים אין מזהים חיצוניים ויאותרו באמצעות חיפוש כותרת, שעשוי להיות פחות מדויק."
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total} פרקים"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr "{watchedCount} מתוך {episodeCount} פרקים נצפו"
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr "{watchedCount} מתוך {episodeCount} פרקים נצפו"
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr "{watchedCount}/{episodeCount, plural, one {# פרק} two {# פרקים} many {# פרקים} other {# פרקים}}"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr "{watchedEpisodes}/{totalEpisodes, plural, one {# פרק} two {# פרקים} many {# פרקים} other {# פרקים}}"
@@ -198,6 +225,10 @@ msgstr "{watchlistCount} פריטים"
msgid "Account"
msgstr "חשבון"
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr "פעולות"
@@ -221,15 +252,20 @@ msgstr "הוסף <0>Generic Destination</0> והדבק את הכתובת למע
msgid "Add a new webhook and paste the URL above"
msgstr "הוסף webhook חדש והדבק את הכתובת למעלה"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "הוסף לספרייה"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "הוסף לרשימת הצפייה"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "כבר יש לך חשבון? התחבר"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "אירעה שגיאה בלתי צפויה בעת טעינת הדף. תוכל לנסות שוב או לחזור ללוח הבקרה."
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "דיווח שימוש אנונימי"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr "עדכני — {count, plural, one {# פרק סומן כנצפה} two {# פרקים סומנו כנצפו} many {# פרקים סומנו כנצפו} other {# פרקים סומנו כנצפו}}"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "שינוי סיסמה"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "שינוי סיסמה"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "שינוי שרת"
msgid "Check configuration"
msgstr "בדוק תצורה"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "בדוק עדכונים"
@@ -530,6 +569,7 @@ msgstr "סגור"
msgid "Completed"
msgstr "הושלם"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "לא ניתן לטעון את פרטי האדם"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "יצירת חשבון"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "יצירת חשבון"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "צור את חשבונך"
msgid "Creating…"
msgstr "יוצר…"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "סיסמה נוכחית"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "נדרשת סיסמה נוכחית"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "אזור מסוכן"
@@ -732,6 +784,10 @@ msgstr "נתק"
msgid "Disconnect {label}"
msgstr "נתק את {label}"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "אין לך שרת?"
@@ -745,6 +801,10 @@ msgstr "אין לך חשבון?"
msgid "Done"
msgstr "סיום"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "הקש פעמיים כדי לנקות את הסינון"
@@ -753,6 +813,10 @@ msgstr "הקש פעמיים כדי לנקות את הסינון"
msgid "Double tap to filter by {label}"
msgstr "הקש פעמיים לסינון לפי {label}"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "הורד גיבוי"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr "עורך"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr "דוא\"ל"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "הפעל את סוג ההתראה \"Playback Stop\""
@@ -794,10 +869,19 @@ msgstr "הפעל את סוג ההתראה <0>Playback Stop</0>"
msgid "Enable the <0>Playback</0> event category"
msgstr "הפעל את קטגוריית האירוע <0>Playback</0>"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "הזן את הקוד הבא באתר {source} כדי לאשר את Sofa."
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "הזן את סיסמתך הנוכחית ובחר סיסמה חדשה."
@@ -828,11 +912,13 @@ msgstr "פרק {episodeNumber}"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "פרק {episodeNumber}, {episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "פרק סומן כלא נצפה"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr "שגיאה"
msgid "Errors ({errorCount})"
msgstr "שגיאות ({errorCount})"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "ניתוק {label} נכשל"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "טעינת הגדרות לוח הזמנים לגיבוי נכשלה."
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "הכניסה לחשבון נכשלה"
msgid "Failed to start {sourceLabel} connection"
msgstr "הפעלת החיבור ל-{sourceLabel} נכשלה"
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "הפעלת המשימה נכשלה"
@@ -1156,14 +1254,15 @@ msgstr "הנה מה שקורה בספרייה שלך"
msgid "Home"
msgstr "בית"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "מטמון תמונות"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "מטמון תמונות"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "מייבא מ-{source}"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "בספרייה"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "בספרייה"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "ברשימת הצפייה"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1356,10 +1456,19 @@ msgstr "רענון הספרייה"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "טוען…"
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "סמן הכל כנצפה"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "סמן כנצפה"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "סמן כנצפה"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "כל פרקי \"{titleName}\" סומנו כנצפו"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "סומן כנצפה"
msgid "Member since {memberSince}"
msgstr "חבר מאז {memberSince}"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "שני"
@@ -1490,11 +1614,20 @@ msgstr "סרטים {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr "שם"
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "לא מתקבלים חשבונות חדשים כרגע. פנה למנה
msgid "New backup"
msgstr "גיבוי חדש"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "פרק הבא"
msgid "Next run"
msgstr "הרצה הבאה"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "לא מוגדר"
msgid "Not Found"
msgstr "לא נמצא"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "ברשימת הצפייה"
@@ -1639,6 +1779,7 @@ msgstr "פתח את Radarr, עבור אל <0>Settings > Import Lists</0>"
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "פתח את Radarr, עבור אל Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "פתח את Sonarr, עבור אל <0>Settings > Import Lists</0>"
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "פתח את Sonarr, עבור אל Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "או"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "או"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "מנתח..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr "סיסמה"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "הסיסמה עודכנה"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "הסיסמאות אינן תואמות"
@@ -1716,6 +1882,14 @@ msgstr "האדם לא נמצא"
msgid "Play trailer"
msgstr "הפעל טריילר"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "תוכניות טלוויזיה פופולריות"
msgid "Pre-restore backup"
msgstr "גיבוי לפני שחזור"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "פעולות מהירות"
msgid "Radarr List URL"
msgstr "כתובת רשימת Radarr"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "דורג {stars, plural, one {# כוכב} two {# כוכבים} many {#
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "דירוג"
@@ -1836,6 +2020,10 @@ msgstr "דירוג"
msgid "Rating removed"
msgstr "הדירוג הוסר"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "ההרשמה נסגרה"
msgid "Registration Closed"
msgstr "ההרשמה סגורה"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "ההרשמה נפתחה"
msgid "Remove"
msgstr "הסר"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "הסר מהספרייה"
@@ -1939,14 +2134,18 @@ msgstr "הסר מהספרייה"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "הסר מהספרייה"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "להסיר מהספרייה?"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "הסר תמונה"
@@ -2133,6 +2332,10 @@ msgstr "חיפוש…"
msgid "Season {seasonNumber}"
msgstr "עונה {seasonNumber}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr "שרת"
msgid "Server Health"
msgstr "תקינות השרת"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "כתובת השרת"
@@ -2188,6 +2392,7 @@ msgstr "הגדר את פרופיל האיכות המועדף ותיקיית הב
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "הגדרות"
@@ -2212,15 +2417,17 @@ msgstr "הצג פחות"
msgid "Show more"
msgstr "הצג עוד"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "התחבר"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "התחבר"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr "התחבר עם {providerName}"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "התנתק"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "התנתק"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "Sofa יתעד אוטומטית סרטים ופרקים כשתסיים ל
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "משהו השתבש…"
msgid "Sonarr List URL"
msgstr "כתובת רשימת Sonarr"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "התחל לגלות"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr "טריילר"
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "פופולרי היום"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "פופולרי היום"
@@ -2554,6 +2772,10 @@ msgstr "לא ידוע"
msgid "unlimited"
msgstr "ללא הגבלה"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "לא נגיש"
@@ -2578,6 +2800,10 @@ msgstr "בוטלה צפייה בכל {seasonLabel}"
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "בוטלה צפייה ב-S{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "בדיקות עדכון הופעלו"
msgid "Update failed"
msgstr "העדכון נכשל"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "עדכן סיסמה"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "עדכן סיסמה"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "העלה תמונת פרופיל"
msgid "URL copied to clipboard"
msgstr "כתובת ה-URL הועתקה ללוח"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "צפה בגרסה"
@@ -2699,20 +2938,26 @@ msgstr "היסטוריית צפייה"
msgid "Watch on {name}"
msgstr "צפה ב-{name}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "נצפתה כל {seasonLabel}"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "נצפתה כל {seasonName}"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "נצפה S{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr "כתובת Webhook"
msgid "Wednesday"
msgstr "רביעי"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "הספרייה שלך ריקה"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "שמך"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""
+294 -40
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: it\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:53\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -37,6 +37,11 @@ msgstr "{0, plural, one {# immagine} other {# immagini}}"
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, one {# titolo} other {# titoli}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, one {# titolo} other {# titoli}}"
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr ""
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr ""
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -156,21 +173,29 @@ msgstr ""
msgid "{ratingCount} ratings"
msgstr ""
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr ""
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total} episodi"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr ""
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr ""
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr ""
@@ -198,6 +225,10 @@ msgstr ""
msgid "Account"
msgstr ""
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr "Azioni"
@@ -221,15 +252,20 @@ msgstr "Aggiungi una <0>Destinazione generica</0> e incolla l'URL sopra"
msgid "Add a new webhook and paste the URL above"
msgstr "Aggiungi un nuovo webhook e incolla l'URL sopra"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "Aggiungi alla libreria"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "Aggiungi alla watchlist"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "Hai già un account? Accedi"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "Si è verificato un errore imprevisto durante il caricamento di questa pagina. Puoi riprovare o tornare alla dashboard."
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "Segnalazione anonima dell'utilizzo"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "Cambia password"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "Cambia password"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "Cambia server"
msgid "Check configuration"
msgstr "Verifica configurazione"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "Cerca aggiornamenti"
@@ -530,6 +569,7 @@ msgstr "Chiudi"
msgid "Completed"
msgstr "Completato"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "Impossibile caricare i dettagli della persona"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "Crea account"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "Crea account"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "Crea il tuo account"
msgid "Creating…"
msgstr "Creazione in corso…"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "Password attuale"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "La password attuale è obbligatoria"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "Zona pericolosa"
@@ -732,6 +784,10 @@ msgstr "Disconnetti"
msgid "Disconnect {label}"
msgstr "Disconnetti {label}"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "Non hai un server?"
@@ -745,6 +801,10 @@ msgstr "Non hai un account?"
msgid "Done"
msgstr "Fatto"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "Tocca due volte per rimuovere questo filtro"
@@ -753,6 +813,10 @@ msgstr "Tocca due volte per rimuovere questo filtro"
msgid "Double tap to filter by {label}"
msgstr "Tocca due volte per filtrare per {label}"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "Scarica backup"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr "Montatore"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "Abilita il tipo di notifica \"Playback Stop\""
@@ -794,10 +869,19 @@ msgstr "Abilita il tipo di notifica <0>Playback Stop</0>"
msgid "Enable the <0>Playback</0> event category"
msgstr "Abilita la categoria evento <0>Playback</0>"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "Inserisci il codice qui sotto sul sito di {source} per autorizzare Sofa."
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "Inserisci la tua password attuale e scegline una nuova."
@@ -828,11 +912,13 @@ msgstr "Episodio {episodeNumber}"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "Episodio {episodeNumber}, {episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "Episodio non visto"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr "Errore"
msgid "Errors ({errorCount})"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "Impossibile disconnettere {label}"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "Impossibile caricare le impostazioni di pianificazione backup."
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "Impossibile accedere"
msgid "Failed to start {sourceLabel} connection"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "Impossibile avviare il job"
@@ -1156,14 +1254,15 @@ msgstr "Ecco cosa sta succedendo nella tua libreria"
msgid "Home"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "Cache immagini"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "Cache immagini"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "Importazione da {source} in corso"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "In libreria"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "In libreria"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "Nella watchlist"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1356,10 +1456,19 @@ msgstr "Aggiornamento libreria"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "Caricamento…"
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "Segna tutti come visti"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "Segna come visto"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "Segna come visto"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "Tutti gli episodi di \"{titleName}\" segnati come visti"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "Segnato come visto"
msgid "Member since {memberSince}"
msgstr "Membro dal {memberSince}"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "Lunedì"
@@ -1490,11 +1614,20 @@ msgstr "Film {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr "Nome"
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "La registrazione di nuovi account non è disponibile al momento. Contatt
msgid "New backup"
msgstr "Nuovo backup"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "Episodio successivo"
msgid "Next run"
msgstr "Prossima esecuzione"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "Non configurato"
msgid "Not Found"
msgstr "Non trovato"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "In watchlist"
@@ -1639,6 +1779,7 @@ msgstr "Apri Radarr, vai su <0>Impostazioni > Liste di importazione</0>"
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "Apri Radarr, vai su Impostazioni > Liste di importazione"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "Apri Sonarr, vai su <0>Impostazioni > Liste di importazione</0>"
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "Apri Sonarr, vai su Impostazioni > Liste di importazione"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "o"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "O"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "Analisi in corso..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "Password aggiornata"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "Le password non corrispondono"
@@ -1716,6 +1882,14 @@ msgstr "Persona non trovata"
msgid "Play trailer"
msgstr "Riproduci trailer"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "Serie TV popolari"
msgid "Pre-restore backup"
msgstr "Backup pre-ripristino"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "Azioni rapide"
msgid "Radarr List URL"
msgstr "URL lista Radarr"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "{stars, plural, one {# stella} other {# stelle}}"
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "Valutazione"
@@ -1836,6 +2020,10 @@ msgstr "Valutazione"
msgid "Rating removed"
msgstr "Valutazione rimossa"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "Registrazione chiusa"
msgid "Registration Closed"
msgstr "Registrazione chiusa"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "Registrazione aperta"
msgid "Remove"
msgstr "Rimuovi"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "Rimuovi dalla libreria"
@@ -1939,14 +2134,18 @@ msgstr "Rimuovi dalla libreria"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "Rimuovi dalla libreria"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "Rimuovere dalla libreria?"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "Rimuovi foto"
@@ -2133,6 +2332,10 @@ msgstr "Cerca…"
msgid "Season {seasonNumber}"
msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr ""
msgid "Server Health"
msgstr "Salute del server"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "URL server"
@@ -2188,6 +2392,7 @@ msgstr "Imposta il profilo di qualità e la cartella radice preferiti"
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "Impostazioni"
@@ -2212,15 +2417,17 @@ msgstr "Mostra meno"
msgid "Show more"
msgstr "Mostra di più"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "Accedi"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "Accedi"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "Esci"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "Esci"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "Sofa registrerà automaticamente film ed episodi quando finisci di guard
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "Qualcosa è andato storto…"
msgid "Sonarr List URL"
msgstr "URL lista Sonarr"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "Inizia a esplorare"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "In tendenza oggi"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "In tendenza oggi"
@@ -2554,6 +2772,10 @@ msgstr "sconosciuto"
msgid "unlimited"
msgstr "illimitato"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "Non raggiungibile"
@@ -2578,6 +2800,10 @@ msgstr ""
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "Non visto S{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "Controllo aggiornamenti abilitato"
msgid "Update failed"
msgstr "Aggiornamento fallito"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "Aggiorna password"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "Aggiorna password"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "Carica immagine del profilo"
msgid "URL copied to clipboard"
msgstr "URL copiato negli appunti"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "Visualizza rilascio"
@@ -2699,20 +2938,26 @@ msgstr "Cronologia visioni"
msgid "Watch on {name}"
msgstr "Guarda su {name}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "Segnata come vista tutta la {seasonLabel}"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "Segnata come vista tutta la {seasonName}"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "Visto S{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr "URL webhook"
msgid "Wednesday"
msgstr "Mercoledì"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "La tua libreria è vuota"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "Il tuo nome"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""
+295 -41
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: ja\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:53\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -37,6 +37,11 @@ msgstr "{0, plural, other {# 枚の画像}}"
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, other {# 件のタイトル}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, other {# 件のタイトル}}"
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr "{backupCount, plural, other {# 件のバックアップ}}を保存済み"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
msgstr "{backupCount}件のバックアップ · 最終: <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr "{cachedImageCount}枚のキャッシュ済み画像"
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr "{count, plural, other {# 件前のエピソード}}が未視聴"
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr "{count}話{suffix}"
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -156,21 +173,29 @@ msgstr "{movieCount}本の映画、{episodeCount}件のエピソード"
msgid "{ratingCount} ratings"
msgstr "{ratingCount}件の評価"
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr "{unresolvedCount}件の項目に外部IDがないため、タイトル検索で照合されますが、精度が低くなる場合があります。"
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total}エピソード"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr "{episodeCount}件中{watchedCount}件のエピソードを視聴済み"
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr "{episodeCount}件中{watchedCount}件のエピソードを視聴済み"
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr "{watchedCount}/{episodeCount, plural, other {# エピソード}}"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr "{watchedEpisodes}/{totalEpisodes, plural, other {# エピソード}}"
@@ -198,6 +225,10 @@ msgstr "{watchlistCount}件"
msgid "Account"
msgstr "アカウント"
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr "操作"
@@ -221,15 +252,20 @@ msgstr "<0>Generic Destination</0>を追加し、上記のURLを貼り付けて
msgid "Add a new webhook and paste the URL above"
msgstr "新しいWebhookを追加し、上記のURLを貼り付けてください"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "ライブラリに追加"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "ウォッチリストに追加"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "すでにアカウントをお持ちの方はサインイン"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "このページの読み込み中に予期しないエラーが発生しました。再試行するか、ダッシュボードに戻ってください。"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "匿名の使用状況レポート"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr "追いつきました — {count, plural, other {# エピソード}}を視聴済みにしました"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "パスワードを変更"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "パスワード変更"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "サーバーを変更"
msgid "Check configuration"
msgstr "設定を確認"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "アップデートを確認"
@@ -530,6 +569,7 @@ msgstr "閉じる"
msgid "Completed"
msgstr "完了"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "人物の詳細を読み込めませんでした"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "アカウントを作成"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "アカウント作成"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "アカウントを作成する"
msgid "Creating…"
msgstr "作成中…"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "現在のパスワード"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "現在のパスワードは必須です"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "危険な操作"
@@ -732,6 +784,10 @@ msgstr "切断"
msgid "Disconnect {label}"
msgstr "{label}を切断"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "サーバーをお持ちでないですか?"
@@ -745,6 +801,10 @@ msgstr "アカウントをお持ちでないですか?"
msgid "Done"
msgstr "完了"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "ダブルタップでこのフィルターをクリア"
@@ -753,6 +813,10 @@ msgstr "ダブルタップでこのフィルターをクリア"
msgid "Double tap to filter by {label}"
msgstr "ダブルタップで{label}で絞り込む"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "バックアップをダウンロード"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr "編集"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr "メールアドレス"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "「Playback Stop」通知タイプを有効にしてください"
@@ -794,10 +869,19 @@ msgstr "<0>Playback Stop</0>通知タイプを有効にしてください"
msgid "Enable the <0>Playback</0> event category"
msgstr "<0>Playback</0>イベントカテゴリを有効にしてください"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "Sofaを認証するには、{source}のウェブサイトで以下のコードを入力してください。"
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "現在のパスワードを入力し、新しいパスワードを選択してください。"
@@ -828,11 +912,13 @@ msgstr "エピソード{episodeNumber}"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "エピソード{episodeNumber}、{episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "エピソードを未視聴にしました"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr "エラー"
msgid "Errors ({errorCount})"
msgstr "エラー ({errorCount})"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "{label}の切断に失敗しました"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "バックアップスケジュール設定の読み込みに失敗しました。"
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "サインインに失敗しました"
msgid "Failed to start {sourceLabel} connection"
msgstr "{sourceLabel}の接続開始に失敗しました"
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "ジョブの起動に失敗しました"
@@ -1156,14 +1254,15 @@ msgstr "ライブラリの最新情報"
msgid "Home"
msgstr "ホーム"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "画像キャッシュ"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "画像キャッシュ"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "{source}からインポート中"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "ライブラリ内"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "ライブラリ内"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "ウォッチリスト内"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1356,10 +1456,19 @@ msgstr "ライブラリ更新"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "読み込み中…"
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "すべて視聴済みにする"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "視聴済みにする"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "視聴済みにする"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "「{titleName}」のすべてのエピソードを視聴済みにしま
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "視聴済みにしました"
msgid "Member since {memberSince}"
msgstr "{memberSince}から利用中"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "月曜日"
@@ -1490,11 +1614,20 @@ msgstr "映画 {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr "名前"
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "現在、新規アカウントは受け付けていません。アクセ
msgid "New backup"
msgstr "新規バックアップ"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "次のエピソード"
msgid "Next run"
msgstr "次回実行"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "未設定"
msgid "Not Found"
msgstr "見つかりません"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "ウォッチリスト内"
@@ -1639,6 +1779,7 @@ msgstr "Radarrを開き、<0>設定 > インポートリスト</0>に移動す
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "Radarrを開き、設定 > インポートリストに移動する"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "Sonarrを開き、<0>設定 > インポートリスト</0>に移動す
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "Sonarrを開き、設定 > インポートリストに移動する"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "または"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "または"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "解析中..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr "パスワード"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "パスワードを更新しました"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "パスワードが一致しません"
@@ -1716,6 +1882,14 @@ msgstr "人物が見つかりません"
msgid "Play trailer"
msgstr "トレーラーを再生"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "人気のTVシリーズ"
msgid "Pre-restore backup"
msgstr "復元前バックアップ"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "クイックアクション"
msgid "Radarr List URL"
msgstr "RadarrリストURL"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "{stars, plural, other {#つ星}}で評価しました"
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "評価"
@@ -1836,6 +2020,10 @@ msgstr "評価"
msgid "Rating removed"
msgstr "評価を削除しました"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "登録を無効にしました"
msgid "Registration Closed"
msgstr "登録が締め切られています"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "登録を有効にしました"
msgid "Remove"
msgstr "削除"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "ライブラリから削除"
@@ -1939,14 +2134,18 @@ msgstr "ライブラリから削除"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "ライブラリから削除"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "ライブラリから削除しますか?"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "写真を削除"
@@ -2133,6 +2332,10 @@ msgstr "検索…"
msgid "Season {seasonNumber}"
msgstr "シーズン{seasonNumber}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr "サーバー"
msgid "Server Health"
msgstr "サーバーヘルス"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "サーバーURL"
@@ -2188,6 +2392,7 @@ msgstr "希望する品質プロファイルとルートフォルダを設定す
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "設定"
@@ -2212,15 +2417,17 @@ msgstr "折りたたむ"
msgid "Show more"
msgstr "もっと見る"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "サインイン"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "サインイン"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr "{providerName}でサインイン"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "サインアウト"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "サインアウト"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "視聴完了後、Sofaが自動的に映画やエピソードを記録
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "エラーが発生しました…"
msgid "Sonarr List URL"
msgstr "SonarrリストURL"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "探索を開始"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr "トレーラー"
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "今日のトレンド"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "今日のトレンド"
@@ -2554,6 +2772,10 @@ msgstr "不明"
msgid "unlimited"
msgstr "無制限"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "接続不可"
@@ -2578,6 +2800,10 @@ msgstr "{seasonLabel}のすべてを未視聴にしました"
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "S{seasonNum} E{epNum}を未視聴にしました"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "アップデート確認を有効にしました"
msgid "Update failed"
msgstr "更新に失敗しました"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "パスワードを変更"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "パスワードを変更"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "プロフィール画像をアップロード"
msgid "URL copied to clipboard"
msgstr "URLをクリップボードにコピーしました"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "リリースを確認"
@@ -2699,20 +2938,26 @@ msgstr "視聴履歴"
msgid "Watch on {name}"
msgstr "{name}で視聴"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "{seasonLabel}のすべてを視聴済みにしました"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "{seasonName}のすべてを視聴済みにしました"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "S{seasonNum} E{epNum}を視聴済みにしました"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr ""
msgid "Wednesday"
msgstr "水曜日"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "ライブラリは空です"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "お名前"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""
+295 -41
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: ko\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:53\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -37,6 +37,11 @@ msgstr "{0, plural, other {# 이미지}}"
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, other {# 타이틀}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, other {# 타이틀}}"
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr "{backupCount, plural, other {백업 #개}} 저장됨"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
msgstr "{backupCount}개 백업 · 마지막 <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr "캐시된 이미지 {cachedImageCount}개"
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr "{count, plural, other {이전 에피소드 #편}} 미시청"
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr "{count}화{suffix}"
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -156,21 +173,29 @@ msgstr "영화 {movieCount}편, 에피소드 {episodeCount}편"
msgid "{ratingCount} ratings"
msgstr "평점 {ratingCount}개"
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr "{unresolvedCount}개 항목에 외부 ID가 없어 제목 검색으로 처리되며, 정확도가 낮을 수 있습니다."
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total} 에피소드"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr "{episodeCount}개 에피소드 중 {watchedCount}개 시청"
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr "{episodeCount}개 에피소드 중 {watchedCount}개 시청"
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr "{watchedCount}/{episodeCount, plural, other {# 에피소드}}"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr "{watchedEpisodes}/{totalEpisodes, plural, other {# 에피소드}}"
@@ -198,6 +225,10 @@ msgstr "{watchlistCount}개 항목"
msgid "Account"
msgstr "계정"
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr "동작"
@@ -221,15 +252,20 @@ msgstr "<0>Generic Destination</0>을 추가하고 위의 URL을 붙여넣으세
msgid "Add a new webhook and paste the URL above"
msgstr "새 웹훅을 추가하고 위의 URL을 붙여넣으세요"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "라이브러리에 추가"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "찜 목록에 추가"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "이미 계정이 있으신가요? 로그인"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "페이지를 불러오는 중 예기치 못한 오류가 발생했습니다. 다시 시도하거나 대시보드로 돌아가세요."
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "익명 사용 통계 보고"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr "따라잡기 완료 — {count, plural, other {에피소드 #개}}를 시청 처리했습니다"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "비밀번호 변경"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "비밀번호 변경"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "서버 변경"
msgid "Check configuration"
msgstr "설정 확인"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "업데이트 확인"
@@ -530,6 +569,7 @@ msgstr "닫기"
msgid "Completed"
msgstr "완료됨"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "인물 정보를 불러올 수 없습니다"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "계정 만들기"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "계정 만들기"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "계정을 만드세요"
msgid "Creating…"
msgstr "생성 중…"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "현재 비밀번호"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "현재 비밀번호를 입력해주세요"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "위험 구역"
@@ -732,6 +784,10 @@ msgstr "연결 해제"
msgid "Disconnect {label}"
msgstr "{label} 연결 해제"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "서버가 없으신가요?"
@@ -745,6 +801,10 @@ msgstr "계정이 없으신가요?"
msgid "Done"
msgstr "완료"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "두 번 탭하여 이 필터 지우기"
@@ -753,6 +813,10 @@ msgstr "두 번 탭하여 이 필터 지우기"
msgid "Double tap to filter by {label}"
msgstr "두 번 탭하여 {label} 필터 적용"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "백업 다운로드"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr "편집자"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr "이메일"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "\"Playback Stop\" 알림 유형 활성화"
@@ -794,10 +869,19 @@ msgstr "<0>Playback Stop</0> 알림 유형을 활성화하세요"
msgid "Enable the <0>Playback</0> event category"
msgstr "<0>Playback</0> 이벤트 카테고리를 활성화하세요"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "{source} 웹사이트에서 아래 코드를 입력하여 Sofa를 인증하세요."
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "현재 비밀번호를 입력하고 새 비밀번호를 설정하세요."
@@ -828,11 +912,13 @@ msgstr "에피소드 {episodeNumber}"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "에피소드 {episodeNumber}, {episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "에피소드 시청 취소됨"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr "오류"
msgid "Errors ({errorCount})"
msgstr "오류 ({errorCount})"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "{label} 연결 해제 실패"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "백업 일정 설정을 불러오지 못했습니다."
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "로그인 실패"
msgid "Failed to start {sourceLabel} connection"
msgstr "{sourceLabel} 연결 시작 실패"
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "작업 실행 실패"
@@ -1156,14 +1254,15 @@ msgstr "라이브러리의 현황입니다"
msgid "Home"
msgstr "홈"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "이미지 캐시"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "이미지 캐시"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "{source}에서 가져오는 중"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "라이브러리에 있음"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "라이브러리에 있음"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "찜 목록에 있음"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1356,10 +1456,19 @@ msgstr "라이브러리 새로고침"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "로딩 중…"
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "모두 시청 완료로 표시"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "시청 완료로 표시"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "시청 완료 표시"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "\"{titleName}\"의 모든 에피소드를 시청 완료로 표시했습
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "시청 완료로 표시됨"
msgid "Member since {memberSince}"
msgstr "{memberSince}부터 회원"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "월요일"
@@ -1490,11 +1614,20 @@ msgstr "영화 {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr "이름"
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "현재 새 계정을 받고 있지 않습니다. 접근이 필요하시
msgid "New backup"
msgstr "새 백업"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "다음 에피소드"
msgid "Next run"
msgstr "다음 실행"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "구성되지 않음"
msgid "Not Found"
msgstr "찾을 수 없음"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "찜 목록에 있음"
@@ -1639,6 +1779,7 @@ msgstr "Radarr를 열고, <0>Settings > Import Lists</0>로 이동하세요"
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "Radarr를 열고, Settings > Import Lists로 이동하세요"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "Sonarr를 열고, <0>Settings > Import Lists</0>로 이동하세요"
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "Sonarr를 열고, Settings > Import Lists로 이동하세요"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "또는"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "또는"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "파싱 중..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr "비밀번호"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "비밀번호가 업데이트되었습니다"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "비밀번호가 일치하지 않습니다"
@@ -1716,6 +1882,14 @@ msgstr "인물을 찾을 수 없습니다"
msgid "Play trailer"
msgstr "예고편 재생"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "인기 TV 프로그램"
msgid "Pre-restore backup"
msgstr "복원 전 백업"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "빠른 실행"
msgid "Radarr List URL"
msgstr "Radarr 목록 URL"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "별 {stars, plural, other {#개}}로 평가됨"
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "평점"
@@ -1836,6 +2020,10 @@ msgstr "평점"
msgid "Rating removed"
msgstr "평점이 삭제되었습니다"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "회원가입이 비활성화되었습니다"
msgid "Registration Closed"
msgstr "회원가입 비활성화됨"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "회원가입이 활성화되었습니다"
msgid "Remove"
msgstr "제거"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "라이브러리에서 제거"
@@ -1939,14 +2134,18 @@ msgstr "라이브러리에서 제거"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "라이브러리에서 제거"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "라이브러리에서 제거하시겠습니까?"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "사진 제거"
@@ -2133,6 +2332,10 @@ msgstr "검색…"
msgid "Season {seasonNumber}"
msgstr "시즌 {seasonNumber}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr "서버"
msgid "Server Health"
msgstr "서버 상태"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "서버 URL"
@@ -2188,6 +2392,7 @@ msgstr "선호하는 품질 프로필과 루트 폴더를 설정하세요"
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "설정"
@@ -2212,15 +2417,17 @@ msgstr "간략히 보기"
msgid "Show more"
msgstr "더 보기"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "로그인"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "로그인"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr "{providerName}(으)로 로그인"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "로그아웃"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "로그아웃"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "시청을 완료하면 Sofa가 자동으로 영화와 에피소드를
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "오류가 발생했습니다…"
msgid "Sonarr List URL"
msgstr "Sonarr 목록 URL"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "탐색 시작"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr "예고편"
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "오늘의 인기 콘텐츠"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "오늘의 인기 콘텐츠"
@@ -2554,6 +2772,10 @@ msgstr "알 수 없음"
msgid "unlimited"
msgstr "무제한"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "연결 불가"
@@ -2578,6 +2800,10 @@ msgstr "{seasonLabel} 전체 시청 취소"
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "S{seasonNum} E{epNum} 시청 취소됨"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "자동 업데이트 확인이 활성화되었습니다"
msgid "Update failed"
msgstr "업데이트 실패"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "비밀번호 변경"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "비밀번호 변경"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "프로필 사진 업로드"
msgid "URL copied to clipboard"
msgstr "URL이 클립보드에 복사되었습니다"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "릴리스 보기"
@@ -2699,20 +2938,26 @@ msgstr "시청 기록"
msgid "Watch on {name}"
msgstr "{name}에서 시청"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "{seasonLabel} 전체 시청 완료"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "{seasonName} 전체 시청 완료"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "S{seasonNum} E{epNum} 시청 완료"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr "웹훅 URL"
msgid "Wednesday"
msgstr "수요일"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "라이브러리가 비어 있습니다"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "이름"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""
+295 -41
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: nl\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:53\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -37,6 +37,11 @@ msgstr "{0, plural, one {# afbeelding} other {# afbeeldingen}}"
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, one {# titel} other {# titels}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, one {# titel} other {# titels}}"
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr "{backupCount, plural, one {# back-up} other {# back-ups}} opgeslagen"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
msgstr "{backupCount} back-ups · laatste <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr "{cachedImageCount} gecachede afbeeldingen"
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr "{count, plural, one {# eerdere aflevering} other {# eerdere afleveringen}} niet bekeken"
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr "{count} afl{suffix}"
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -156,21 +173,29 @@ msgstr "{movieCount} films, {episodeCount} afleveringen"
msgid "{ratingCount} ratings"
msgstr "{ratingCount} beoordelingen"
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr "{unresolvedCount} items hebben geen externe ID's en worden gevonden via titelzoekopdracht, wat minder nauwkeurig kan zijn."
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total} afleveringen"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr "{watchedCount} van {episodeCount} afleveringen bekeken"
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr "{watchedCount} van {episodeCount} afleveringen bekeken"
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr "{watchedCount}/{episodeCount, plural, one {# aflevering} other {# afleveringen}}"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr "{watchedEpisodes}/{totalEpisodes, plural, one {# aflevering} other {# afleveringen}}"
@@ -198,6 +225,10 @@ msgstr ""
msgid "Account"
msgstr ""
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr "Acties"
@@ -221,15 +252,20 @@ msgstr "Voeg een <0>Generic Destination</0> toe en plak de URL hierboven in"
msgid "Add a new webhook and paste the URL above"
msgstr "Voeg een nieuwe webhook toe en plak de URL hierboven in"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "Toevoegen aan bibliotheek"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "Toevoegen aan kijklijst"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "Al een account? Aanmelden"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "Er is een onverwachte fout opgetreden bij het laden van deze pagina. Probeer het opnieuw of ga terug naar het dashboard."
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "Anonieme gebruiksrapportage"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr "Bijgewerkt — {count, plural, one {# aflevering} other {# afleveringen}} gemarkeerd als bekeken"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "Wachtwoord wijzigen"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "Wachtwoord wijzigen"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "Server wijzigen"
msgid "Check configuration"
msgstr "Configuratie controleren"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "Controleer op updates"
@@ -530,6 +569,7 @@ msgstr "Sluiten"
msgid "Completed"
msgstr "Voltooid"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "Persoonsgegevens konden niet worden geladen"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "Account aanmaken"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "Account aanmaken"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "Maak je account aan"
msgid "Creating…"
msgstr "Aanmaken…"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "Huidig wachtwoord"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "Huidig wachtwoord is verplicht"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "Gevarenzone"
@@ -732,6 +784,10 @@ msgstr "Loskoppelen"
msgid "Disconnect {label}"
msgstr "{label} loskoppelen"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "Geen server?"
@@ -745,6 +801,10 @@ msgstr "Nog geen account?"
msgid "Done"
msgstr "Klaar"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "Dubbel tikken om dit filter te wissen"
@@ -753,6 +813,10 @@ msgstr "Dubbel tikken om dit filter te wissen"
msgid "Double tap to filter by {label}"
msgstr "Dubbel tikken om te filteren op {label}"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "Back-up downloaden"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr "E-mail"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "Schakel het meldingstype \"Playback Stop\" in"
@@ -794,10 +869,19 @@ msgstr "Schakel het meldingstype <0>Playback Stop</0> in"
msgid "Enable the <0>Playback</0> event category"
msgstr "Schakel de gebeurteniscategorie <0>Playback</0> in"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "Voer de onderstaande code in op de website van {source} om Sofa te autoriseren."
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "Voer je huidige wachtwoord in en kies een nieuw wachtwoord."
@@ -828,11 +912,13 @@ msgstr "Aflevering {episodeNumber}"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "Aflevering {episodeNumber}, {episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "Aflevering onbekeken"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr "Fout"
msgid "Errors ({errorCount})"
msgstr "Fouten ({errorCount})"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "{label} loskoppelen mislukt"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "Instellingen voor back-upschema konden niet worden geladen."
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "Aanmelden mislukt"
msgid "Failed to start {sourceLabel} connection"
msgstr "Verbinding met {sourceLabel} starten mislukt"
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "Taak activeren mislukt"
@@ -1156,14 +1254,15 @@ msgstr "Dit is wat er in je bibliotheek gebeurt"
msgid "Home"
msgstr "Startpagina"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "Afbeeldingscache"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "Afbeeldingscache"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "Importeren vanuit {source}"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "In bibliotheek"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "In bibliotheek"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "In kijklijst"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1356,10 +1456,19 @@ msgstr "Bibliotheekvernieuwing"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "Laden…"
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "Alles als bekeken markeren"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "Markeren als bekeken"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "Als bekeken markeren"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "Alle afleveringen van \"{titleName}\" als bekeken gemarkeerd"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "Gemarkeerd als bekeken"
msgid "Member since {memberSince}"
msgstr "Lid sinds {memberSince}"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "Maandag"
@@ -1490,11 +1614,20 @@ msgstr "Films {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr "Naam"
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "Er worden momenteel geen nieuwe accounts geaccepteerd. Neem contact op m
msgid "New backup"
msgstr "Nieuwe back-up"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "Volgende aflevering"
msgid "Next run"
msgstr "Volgende uitvoering"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "Niet geconfigureerd"
msgid "Not Found"
msgstr "Niet gevonden"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "Op kijklijst"
@@ -1639,6 +1779,7 @@ msgstr "Open Radarr, ga naar <0>Instellingen > Importlijsten</0>"
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "Open Radarr, ga naar Instellingen > Importlijsten"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "Open Sonarr, ga naar <0>Instellingen > Importlijsten</0>"
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "Open Sonarr, ga naar Instellingen > Importlijsten"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "of"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "OF"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "Verwerken..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr "Wachtwoord"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "Wachtwoord bijgewerkt"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "Wachtwoorden komen niet overeen"
@@ -1716,6 +1882,14 @@ msgstr "Persoon niet gevonden"
msgid "Play trailer"
msgstr "Trailer afspelen"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "Populaire tv-series"
msgid "Pre-restore backup"
msgstr "Back-up vóór herstel"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "Snelle acties"
msgid "Radarr List URL"
msgstr "Radarr-lijst-URL"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "Beoordeeld met {stars, plural, one {# ster} other {# sterren}}"
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "Beoordeling"
@@ -1836,6 +2020,10 @@ msgstr "Beoordeling"
msgid "Rating removed"
msgstr "Beoordeling verwijderd"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "Registratie gesloten"
msgid "Registration Closed"
msgstr "Registratie gesloten"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "Registratie geopend"
msgid "Remove"
msgstr "Verwijderen"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "Verwijderen uit bibliotheek"
@@ -1939,14 +2134,18 @@ msgstr "Verwijderen uit bibliotheek"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "Verwijderen uit bibliotheek"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "Verwijderen uit bibliotheek?"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "Foto verwijderen"
@@ -2133,6 +2332,10 @@ msgstr "Zoeken…"
msgid "Season {seasonNumber}"
msgstr "Seizoen {seasonNumber}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr ""
msgid "Server Health"
msgstr "Serverstatus"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "Server-URL"
@@ -2188,6 +2392,7 @@ msgstr "Stel je gewenste kwaliteitsprofiel en hoofdmap in"
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "Instellingen"
@@ -2212,15 +2417,17 @@ msgstr "Minder weergeven"
msgid "Show more"
msgstr "Meer weergeven"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "Aanmelden"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "Aanmelden"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr "Aanmelden met {providerName}"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "Afmelden"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "Afmelden"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "Sofa registreert automatisch films en afleveringen wanneer je klaar bent
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "Er is iets misgegaan…"
msgid "Sonarr List URL"
msgstr "Sonarr-lijst-URL"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "Beginnen met verkennen"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "Trending vandaag"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "Trending vandaag"
@@ -2554,6 +2772,10 @@ msgstr "onbekend"
msgid "unlimited"
msgstr "onbeperkt"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "Onbereikbaar"
@@ -2578,6 +2800,10 @@ msgstr "Alles van {seasonLabel} als niet bekeken gemarkeerd"
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "Niet bekeken S{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "Updatecontroles ingeschakeld"
msgid "Update failed"
msgstr "Bijwerken mislukt"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "Wachtwoord bijwerken"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "Wachtwoord bijwerken"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "Profielfoto uploaden"
msgid "URL copied to clipboard"
msgstr "URL gekopieerd naar klembord"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "Release bekijken"
@@ -2699,20 +2938,26 @@ msgstr "Kijkgeschiedenis"
msgid "Watch on {name}"
msgstr "Bekijken op {name}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "Alles van {seasonLabel} als bekeken gemarkeerd"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "Alles van {seasonName} als bekeken gemarkeerd"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "Bekeken S{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr "Webhook-URL"
msgid "Wednesday"
msgstr "Woensdag"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "Je bibliotheek is leeg"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "Jouw naam"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""
+294 -40
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: pt\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:53\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -37,6 +37,11 @@ msgstr "{0, plural, one {# imagem} other {# imagens}}"
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, one {# título} other {# títulos}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, one {# título} other {# títulos}}"
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr ""
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr ""
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -156,21 +173,29 @@ msgstr ""
msgid "{ratingCount} ratings"
msgstr ""
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr ""
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total} episódios"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr ""
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr ""
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr ""
@@ -198,6 +225,10 @@ msgstr ""
msgid "Account"
msgstr "Conta"
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr "Ações"
@@ -221,15 +252,20 @@ msgstr "Adicione um <0>Generic Destination</0> e cole a URL acima"
msgid "Add a new webhook and paste the URL above"
msgstr "Adicione um novo webhook e cole a URL acima"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "Adicionar à Biblioteca"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "Adicionar à lista de desejos"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "Já tem uma conta? Entrar"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "Ocorreu um erro inesperado ao carregar esta página. Você pode tentar novamente ou voltar ao painel."
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "Relatório de uso anônimo"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "Alterar senha"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "Alterar Senha"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "Alterar Servidor"
msgid "Check configuration"
msgstr "Verificar configuração"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "Verificar atualizações"
@@ -530,6 +569,7 @@ msgstr "Fechar"
msgid "Completed"
msgstr "Concluído"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "Não foi possível carregar os detalhes da pessoa"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "Criar conta"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "Criar Conta"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "Crie sua conta"
msgid "Creating…"
msgstr "Criando…"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "Senha atual"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "A senha atual é obrigatória"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "Zona de Perigo"
@@ -732,6 +784,10 @@ msgstr "Desconectar"
msgid "Disconnect {label}"
msgstr "Desconectar {label}"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "Não tem um servidor?"
@@ -745,6 +801,10 @@ msgstr "Não tem uma conta?"
msgid "Done"
msgstr "Concluído"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "Toque duas vezes para remover este filtro"
@@ -753,6 +813,10 @@ msgstr "Toque duas vezes para remover este filtro"
msgid "Double tap to filter by {label}"
msgstr "Toque duas vezes para filtrar por {label}"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "Baixar backup"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr "E-mail"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "Ative o tipo de notificação \"Playback Stop\""
@@ -794,10 +869,19 @@ msgstr "Ative o tipo de notificação <0>Playback Stop</0>"
msgid "Enable the <0>Playback</0> event category"
msgstr "Ative a categoria de evento <0>Playback</0>"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "Insira o código abaixo no site do {source} para autorizar o Sofa."
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "Insira sua senha atual e escolha uma nova."
@@ -828,11 +912,13 @@ msgstr "Episódio {episodeNumber}"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "Episódio {episodeNumber}, {episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "Episódio não assistido"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr "Erro"
msgid "Errors ({errorCount})"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "Falha ao desconectar {label}"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "Falha ao carregar as configurações do agendamento de backup."
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "Falha ao entrar"
msgid "Failed to start {sourceLabel} connection"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "Falha ao acionar tarefa"
@@ -1156,14 +1254,15 @@ msgstr "Veja o que está acontecendo com sua biblioteca"
msgid "Home"
msgstr "Início"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "Cache de imagens"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "Cache de Imagens"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "Importando de {source}"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "Na biblioteca"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "Na Biblioteca"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "Na lista"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1356,10 +1456,19 @@ msgstr "Atualização da biblioteca"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "Carregando…"
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "Marcar Todos como Assistidos"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "Marcar como Assistido"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "Marcar como Assistido"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "Todos os episódios de \"{titleName}\" marcados como vistos"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "Marcado como assistido"
msgid "Member since {memberSince}"
msgstr "Membro desde {memberSince}"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "Segunda-feira"
@@ -1490,11 +1614,20 @@ msgstr "Filmes {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr "Nome"
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "Novas contas não estão sendo aceitas agora. Entre em contato com o adm
msgid "New backup"
msgstr "Novo backup"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "Próximo Episódio"
msgid "Next run"
msgstr "Próxima execução"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "Não configurado"
msgid "Not Found"
msgstr "Não Encontrado"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "Na Lista de Desejos"
@@ -1639,6 +1779,7 @@ msgstr "Abra o Radarr, vá para <0>Settings > Import Lists</0>"
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "Abra o Radarr, vá para Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "Abra o Sonarr, vá para <0>Settings > Import Lists</0>"
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "Abra o Sonarr, vá para Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "ou"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "OU"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "Analisando..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr "Senha"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "Senha atualizada"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "As senhas não coincidem"
@@ -1716,6 +1882,14 @@ msgstr "Pessoa não encontrada"
msgid "Play trailer"
msgstr "Reproduzir trailer"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "Séries Populares"
msgid "Pre-restore backup"
msgstr "Backup pré-restauração"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "Ações Rápidas"
msgid "Radarr List URL"
msgstr "URL da Lista do Radarr"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "Avaliado com {stars, plural, one {# estrela} other {# estrelas}}"
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "Avaliação"
@@ -1836,6 +2020,10 @@ msgstr "Avaliação"
msgid "Rating removed"
msgstr "Avaliação removida"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "Registro fechado"
msgid "Registration Closed"
msgstr "Registro Fechado"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "Registro aberto"
msgid "Remove"
msgstr "Remover"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "Remover da biblioteca"
@@ -1939,14 +2134,18 @@ msgstr "Remover da biblioteca"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "Remover da Biblioteca"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "Remover da biblioteca?"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "Remover Foto"
@@ -2133,6 +2332,10 @@ msgstr "Pesquisar…"
msgid "Season {seasonNumber}"
msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr "Servidor"
msgid "Server Health"
msgstr "Saúde do Servidor"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "URL do Servidor"
@@ -2188,6 +2392,7 @@ msgstr "Defina seu perfil de qualidade preferido e pasta raiz"
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "Configurações"
@@ -2212,15 +2417,17 @@ msgstr "Mostrar menos"
msgid "Show more"
msgstr "Mostrar mais"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "Entrar"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "Entrar"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "Sair"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "Sair"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "O Sofa registrará automaticamente filmes e episódios quando você term
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "Algo deu errado…"
msgid "Sonarr List URL"
msgstr "URL da Lista do Sonarr"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "Começar a explorar"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "Em alta hoje"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "Em Alta Hoje"
@@ -2554,6 +2772,10 @@ msgstr "desconhecido"
msgid "unlimited"
msgstr "ilimitado"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "Inacessível"
@@ -2578,6 +2800,10 @@ msgstr ""
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "Desmarcado T{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "Verificações de atualização ativadas"
msgid "Update failed"
msgstr "Atualização falhou"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "Atualizar senha"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "Atualizar Senha"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "Enviar foto de perfil"
msgid "URL copied to clipboard"
msgstr "URL copiada para a área de transferência"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "Ver versão"
@@ -2699,20 +2938,26 @@ msgstr "Histórico de exibição"
msgid "Watch on {name}"
msgstr "Assistir em {name}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "Todos os episódios de {seasonLabel} assistidos"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "Todos os episódios de {seasonName} assistidos"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "Assistido T{seasonNum} E{epNum}"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr "URL do Webhook"
msgid "Wednesday"
msgstr "Quarta-feira"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "Sua biblioteca está vazia"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "Seu nome"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""
+295 -41
View File
@@ -8,7 +8,7 @@ msgstr ""
"Language: zh\n"
"Project-Id-Version: sofa\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-03-21 16:52\n"
"PO-Revision-Date: 2026-03-23 20:33\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -37,6 +37,11 @@ msgstr "{0, plural, other {# 张图片}}"
msgid "{0, plural, one {# title} other {# titles}}"
msgstr "{0, plural, other {# 部}}"
#. placeholder {0}: import { msg, plural } from "@lingui/core/macro"; import { Trans, useLingui } from "@lingui/react/macro"; import { IconActivity, IconAlertTriangle, IconCalendarCheck, IconCheck, IconDatabase, IconPlayerPlay, IconRefresh, } from "@tabler/icons-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { StatusDot } from "@/components/status-dot"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; import { orpc } from "@/lib/orpc/client"; import type { CronJobName, SystemHealthData } from "@sofa/api/schemas"; import { i18n } from "@sofa/i18n"; const DIGITS_ONLY_RE = /^\d+$/; /** Convert a cron pattern to a short human-readable string */ function cronToHuman(pattern: string): string { const parts = pattern.split(" "); if (parts.length !== 5) return pattern; const [min, hour, _dom, _mon, dow] = parts; // Every N hours: "0 */6 * * *" if (hour.startsWith("*/")) { const n = Number.parseInt(hour.slice(2), 10); return i18n._(msg`Every ${n}h`); } // Twice daily: "0 1,13 * * *" if (hour.includes(",") && !hour.includes("/") && !hour.includes("-")) { const hours = hour.split(","); if (hours.length === 2) { const times = hours.map((h) => `${h.padStart(2, "0")}:${min.padStart(2, "0")}`).join(", "); return i18n._(msg`Daily at ${times}`); } } // Daily at specific time: "0 3 * * *" if (DIGITS_ONLY_RE.test(hour) && DIGITS_ONLY_RE.test(min) && dow === "*") { const time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`; return i18n._(msg`Daily at ${time}`); } // Weekly — use Intl for locale-aware day name if (DIGITS_ONLY_RE.test(dow)) { const dayDate = new Date(2024, 0, 7 + Number(dow)); // 2024-01-07 is a Sunday const dayName = new Intl.DateTimeFormat(i18n.locale, { weekday: "short" }).format(dayDate); return i18n._(msg`Weekly on ${dayName}`); } return pattern; } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } function formatDuration(ms: number): string { if (ms < 1000) return `${ms}ms`; if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`; return `${Math.round(ms / 60000)}m`; } export function SkeletonCards() { return ( <div className="space-y-3"> {["status", "jobs", "storage"].map((s) => ( <Card key={s} className="border-s-primary/30 border-s-2"> <CardContent> <div className="flex items-start gap-3"> <Skeleton className="mt-0.5 h-8 w-8 rounded-lg" /> <div className="flex-1 space-y-2"> <Skeleton className="h-4 w-28" /> <Skeleton className="h-3 w-48" /> </div> </div> </CardContent> </Card> ))} </div> ); } /** Inline component that live-updates a relative timestamp */ function LiveTimeAgo({ date, fallback = "", }: { date: string | Date | null | undefined; fallback?: string; }) { const text = useTimeAgo(date, { fallback }); return <span suppressHydrationWarning>{text}</span>; } /** Hydrates system health state and renders the 3 cards */ export function SystemHealthCards() { const queryClient = useQueryClient(); const { data, isPending, isFetching } = useQuery(orpc.admin.systemHealth.queryOptions()); const isRefreshing = isFetching; const refresh = () => queryClient.invalidateQueries({ queryKey: orpc.admin.systemHealth.key() }); if (isPending || !data) return <SkeletonCards />; return ( <div className="space-y-3"> <SystemStatusCard checkedAt={data.checkedAt} database={data.database} tmdb={data.tmdb} environment={data.environment} isRefreshing={isRefreshing} onRefresh={refresh} /> <BackgroundJobsCard jobs={data.jobs} isRefreshing={isRefreshing} onRefresh={refresh} /> <StorageCard imageCache={data.imageCache} backups={data.backups} isRefreshing={isRefreshing} onRefresh={refresh} /> </div> ); } function RefreshButton({ isRefreshing, onRefresh, }: { isRefreshing: boolean; onRefresh: () => void; }) { const { t } = useLingui(); return ( <Tooltip> <TooltipTrigger render={ <Button variant="ghost" size="icon" aria-label={t`Refresh system health`} onClick={onRefresh} disabled={isRefreshing} className="text-muted-foreground" /> } > {isRefreshing ? <Spinner /> : <IconRefresh />} </TooltipTrigger> <TooltipContent> <Trans>Refresh</Trans> </TooltipContent> </Tooltip> ); } function SystemStatusCard({ checkedAt, database, tmdb, environment, isRefreshing, onRefresh, }: Pick<SystemHealthData, "checkedAt" | "database" | "tmdb" | "environment"> & { isRefreshing: boolean; onRefresh: () => void; }) { rLine truncated
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{0} · last <0/>"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#~ msgid "{0} {1, plural, one {backup} other {backups}} stored"
#~ msgstr ""
@@ -93,31 +98,43 @@ msgstr "{0, plural, other {# 部}}"
#~ msgid "{0}/{1} episodes"
#~ msgstr "{0}/{1} episodes"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
msgid "{backupCount, plural, one {# backup} other {# backups}} stored"
msgstr "{backupCount, plural, other {# 个备份}}已存储"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{backupCount} backups · last <0/>"
msgstr "{backupCount} 个备份 · 最近 <0/>"
#~ msgid "{backupCount} backups · last <0/>"
#~ msgstr "{backupCount} backups · last <0/>"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "{cachedImageCount} cached images"
msgstr "{cachedImageCount} 张缓存图片"
msgid "{cachedImageCount, plural, one {# cached image} other {# cached images}}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{cachedImageCount} cached images"
#~ msgstr "{cachedImageCount} cached images"
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "{count, plural, one {# earlier episode} other {# earlier episodes}} unwatched"
msgstr "{count, plural, other {# 集}}更早的剧集未观看"
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count, plural, one {# ep} other {# eps}}"
msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#~ msgid "{count} earlier {count, plural, one {episode} other {episodes}} unwatched"
#~ msgstr ""
#: apps/web/src/components/titles/cast-carousel.tsx
msgid "{count} ep{suffix}"
msgstr "{count} 集{suffix}"
#~ msgid "{count} ep{suffix}"
#~ msgstr "{count} ep{suffix}"
#: apps/web/src/components/settings/system-health-section.tsx
#~ msgid "{healthyCount} of {0} jobs healthy"
@@ -156,21 +173,29 @@ msgstr "{movieCount} 部电影,{episodeCount} 集"
msgid "{ratingCount} ratings"
msgstr "{ratingCount} 条评分"
#: apps/native/src/components/ui/star-rating.tsx
msgid "{star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "{unresolvedCount} items have no external IDs and will be resolved by title search, which may be less accurate."
msgstr "{unresolvedCount} 个项目没有外部 ID,将通过标题搜索解析,结果可能不够准确。"
#: apps/web/src/components/title-card.tsx
msgid "{watched}/{total} episodes"
msgstr "{watched}/{total} 集"
msgid "{watched}/{total, plural, one {# episode} other {# episodes}}"
msgstr ""
#: apps/web/src/components/title-card.tsx
#~ msgid "{watched}/{total} episodes"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount} of {0} episodes watched"
#~ msgstr ""
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount} of {episodeCount} episodes watched"
msgstr "已观看 {watchedCount}/{episodeCount} 集"
#~ msgid "{watchedCount} of {episodeCount} episodes watched"
#~ msgstr "{watchedCount} of {episodeCount} episodes watched"
#: apps/native/src/components/titles/season-accordion.tsx
#~ msgid "{watchedCount}/{0} {1, plural, one {episode} other {episodes}}"
@@ -180,10 +205,12 @@ msgstr "已观看 {watchedCount}/{episodeCount} 集"
#~ msgid "{watchedCount}/{0} episodes"
#~ msgstr "{watchedCount}/{0} episodes"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/components/titles/season-accordion.tsx
msgid "{watchedCount}/{episodeCount, plural, one {# episode} other {# episodes}}"
msgstr "{watchedCount}/{episodeCount, plural, other {# 集}}"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "{watchedEpisodes}/{totalEpisodes, plural, one {# episode} other {# episodes}}"
msgstr "{watchedEpisodes}/{totalEpisodes, plural, other {# 集}}"
@@ -198,6 +225,10 @@ msgstr "{watchlistCount} 个项目"
msgid "Account"
msgstr "账户"
#: apps/web/src/components/nav-bar.tsx
msgid "Account menu"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Actions"
msgstr "操作"
@@ -221,15 +252,20 @@ msgstr "添加 <0>Generic Destination</0> 并粘贴上方 URL"
msgid "Add a new webhook and paste the URL above"
msgstr "添加新 Webhook 并粘贴上方 URL"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Add profile photo"
msgstr ""
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Add to Library"
msgstr "添加到媒体库"
#: apps/native/src/components/titles/status-action-button.tsx
msgid "Add to watchlist"
msgstr "添加到观看列表"
#~ msgid "Add to watchlist"
#~ msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/title-card.tsx
msgid "Add to Watchlist"
@@ -288,6 +324,7 @@ msgstr "已有账户?立即登录"
msgid "An unexpected error occurred while loading this page. You can try again or head back to the dashboard."
msgstr "加载此页面时发生意外错误。您可以重试或返回主页。"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Anonymous usage reporting"
msgstr "匿名使用报告"
@@ -437,14 +474,15 @@ msgid "Caught up — marked {count, plural, one {# episode} other {# episodes}}
msgstr "已追上 — 已标记 {count, plural, other {# 集}}为已观看"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Change password"
msgstr "修改密码"
#: apps/native/src/app/change-password.tsx
msgid "Change Password"
msgstr "修改密码"
#~ msgid "Change Password"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Change Photo"
@@ -458,6 +496,7 @@ msgstr "更换服务器"
msgid "Check configuration"
msgstr "检查配置"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Check for updates"
msgstr "检查更新"
@@ -530,6 +569,7 @@ msgstr "关闭"
msgid "Completed"
msgstr "已完成"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Confirm new password"
@@ -624,14 +664,16 @@ msgstr "无法加载人物详情"
msgid "Could not load title details"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Create account"
msgstr "创建账户"
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Create Account"
msgstr "创建账户"
#~ msgid "Create Account"
#~ msgstr ""
#: apps/native/src/app/(auth)/login.tsx
msgid "Create an account"
@@ -645,15 +687,25 @@ msgstr "创建您的账户"
msgid "Creating…"
msgstr "创建中…"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password"
msgstr "当前密码"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Current password is required"
msgstr "请输入当前密码"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {time}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Daily at {times}"
msgstr ""
#: apps/web/src/routes/_app/settings.tsx
msgid "Danger Zone"
msgstr "危险区域"
@@ -732,6 +784,10 @@ msgstr "断开连接"
msgid "Disconnect {label}"
msgstr "断开 {label} 的连接"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Display name"
msgstr ""
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Don't have a server?"
msgstr "没有服务器?"
@@ -745,6 +801,10 @@ msgstr "没有账户?"
msgid "Done"
msgstr "完成"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to clear rating"
msgstr ""
#: apps/native/src/components/explore/genre-chip.tsx
msgid "Double tap to clear this filter"
msgstr "双击以清除此筛选条件"
@@ -753,6 +813,10 @@ msgstr "双击以清除此筛选条件"
msgid "Double tap to filter by {label}"
msgstr "双击以按 {label} 筛选"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Double tap to rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/backup-section.tsx
msgid "Download"
@@ -766,6 +830,10 @@ msgstr "下载备份"
msgid "Download your library, watch history, and ratings as JSON"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Edit profile photo"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -773,11 +841,18 @@ msgid "Editor"
msgstr "剪辑师"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Email"
msgstr "邮箱"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Email is required"
msgstr ""
#: apps/native/src/components/settings/integration-configs.ts
msgid "Enable the \"Playback Stop\" notification type"
msgstr "启用“Playback Stop”通知类型"
@@ -794,10 +869,19 @@ msgstr "启用 <0>Playback Stop</0> 通知类型"
msgid "Enable the <0>Playback</0> event category"
msgstr "启用 <0>Playback</0> 事件类别"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Enter a valid email address"
msgstr ""
#: apps/web/src/components/settings/imports-section.tsx
msgid "Enter the code below on {source}'s website to authorize Sofa."
msgstr "请在 {source} 的网站上输入以下代码以授权 Sofa。"
#: apps/native/src/app/(auth)/server-url.tsx
msgid "Enter the full URL for your Sofa server"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
msgid "Enter your current password and choose a new one."
msgstr "输入您的当前密码并设置新密码。"
@@ -828,11 +912,13 @@ msgstr "第 {episodeNumber} 集"
msgid "Episode {episodeNumber}, {episodeLabel}"
msgstr "第 {episodeNumber} 集,{episodeLabel}"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode unwatched"
msgstr "单集已标为未观看"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Episode watched"
@@ -882,6 +968,10 @@ msgstr "错误"
msgid "Errors ({errorCount})"
msgstr "错误 ({errorCount})"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Every {n}h"
msgstr ""
#: apps/native/src/app/(tabs)/(explore)/_layout.tsx
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/native/src/components/navigation/native-tab-bar.tsx
@@ -945,8 +1035,12 @@ msgid "Failed to disconnect {label}"
msgstr "断开 {label} 连接失败"
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Failed to load backup schedule settings."
msgstr "加载备份计划设置失败。"
msgid "Failed to load backup schedule settings"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
#~ msgid "Failed to load backup schedule settings."
#~ msgstr ""
#: apps/web/src/routes/_app/titles.$id.tsx
msgid "Failed to load title"
@@ -1022,6 +1116,10 @@ msgstr "登录失败"
msgid "Failed to start {sourceLabel} connection"
msgstr "启动 {sourceLabel} 连接失败"
#: apps/web/src/components/auth-form.tsx
msgid "Failed to start SSO login"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Failed to trigger job"
msgstr "触发任务失败"
@@ -1156,14 +1254,15 @@ msgstr "以下是您的媒体库近况"
msgid "Home"
msgstr "首页"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/system-health-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache"
msgstr "图片缓存"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Image Cache"
msgstr "图片缓存"
#~ msgid "Image Cache"
#~ msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Image cache and backup disk usage"
@@ -1243,17 +1342,18 @@ msgid "Importing from {source}"
msgstr "正在从 {source} 导入"
#: apps/native/src/app/(tabs)/(home)/index.tsx
msgid "In library"
msgstr "媒体库中"
#~ msgid "In library"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/stats-display.tsx
msgid "In Library"
msgstr "媒体库中"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "In Watchlist"
msgstr "在待看列表中"
#~ msgid "In Watchlist"
#~ msgstr "In Watchlist"
#: apps/native/src/app/(tabs)/(home)/index.tsx
#: apps/web/src/components/dashboard/library-section.tsx
@@ -1356,10 +1456,19 @@ msgstr "媒体库刷新"
msgid "Library statuses"
msgstr ""
#: apps/native/src/components/ui/skeleton.tsx
#: apps/web/src/components/ui/spinner.tsx
msgid "Loading"
msgstr ""
#: apps/web/src/components/auth-form.tsx
msgid "Loading…"
msgstr "加载中…"
#: apps/web/src/components/auth-form.tsx
msgid "Login failed"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
msgid "Lost connection to import. Check status in settings."
@@ -1390,22 +1499,32 @@ msgstr "全部标记为已观看"
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Mark as Watched"
msgstr "标记为已观看"
#~ msgid "Mark as Watched"
#~ msgstr ""
#: apps/native/src/components/ui/poster-card.tsx
#~ msgid "Mark as Watching"
#~ msgstr ""
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Mark episode {epNum} watched"
msgstr ""
#: apps/native/src/components/dashboard/upcoming-row.tsx
msgid "Mark Episode Watched"
msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/title-actions.tsx
msgid "Mark Watched"
msgstr "标记为已观看"
#: apps/native/src/app/title/[id].tsx
msgid "Marked \"{name}\" as watched"
msgstr ""
#: apps/native/src/lib/title-actions.ts
#~ msgid "Marked \"{titleName}\" as completed"
#~ msgstr ""
@@ -1429,6 +1548,7 @@ msgstr "已将\"{titleName}\"的所有剧集标记为已观看"
#~ msgid "Marked as completed"
#~ msgstr ""
#: apps/native/src/app/title/[id].tsx
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Marked as watched"
@@ -1443,6 +1563,10 @@ msgstr "已标记为已观看"
msgid "Member since {memberSince}"
msgstr "注册于 {memberSince}"
#: apps/web/src/components/auth-form.tsx
msgid "Min 8 characters…"
msgstr ""
#: apps/web/src/components/settings/backup-schedule-section.tsx
msgid "Monday"
msgstr "星期一"
@@ -1490,11 +1614,20 @@ msgstr "电影 {select}"
#~ msgid "Movies this month"
#~ msgstr ""
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Name"
msgstr "名称"
#: apps/native/src/app/(auth)/register.tsx
msgid "Name is required"
msgstr ""
#: apps/native/src/app/(auth)/register.tsx
msgid "Name must be at least 2 characters"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Name updated"
@@ -1528,6 +1661,7 @@ msgstr "目前不接受新账户注册。如需访问权限,请联系管理员
msgid "New backup"
msgstr "新建备份"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "New password"
@@ -1559,6 +1693,10 @@ msgstr "下一集"
msgid "Next run"
msgstr "下次运行"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
msgid "Next: S{seasonNum} E{epNum}"
msgstr ""
#: apps/web/src/components/settings/backup-section.tsx
#: apps/web/src/components/settings/system-health-section.tsx
msgid "No backups yet"
@@ -1598,8 +1736,10 @@ msgstr "未配置"
msgid "Not Found"
msgstr "未找到"
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "On Watchlist"
msgstr "在待看列表中"
@@ -1639,6 +1779,7 @@ msgstr "打开 Radarr,前往 <0>Settings > Import Lists</0>"
msgid "Open Radarr, go to Settings > Import Lists"
msgstr "打开 Radarr,前往 Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Open registration"
@@ -1652,13 +1793,26 @@ msgstr "打开 Sonarr,前往 <0>Settings > Import Lists</0>"
msgid "Open Sonarr, go to Settings > Import Lists"
msgstr "打开 Sonarr,前往 Settings > Import Lists"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Opens options to change or remove your photo"
msgstr ""
#: apps/native/src/app/title/[id].tsx
msgid "Opens the trailer in YouTube"
msgstr ""
#: apps/native/src/components/explore/hero-banner.tsx
msgid "Opens title details"
msgstr ""
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
msgid "or"
msgstr "或"
#: apps/native/src/app/(auth)/login.tsx
msgid "OR"
msgstr "或"
#~ msgid "OR"
#~ msgstr ""
#: apps/native/src/app/+not-found.tsx
msgid "Page Not Found"
@@ -1673,16 +1827,28 @@ msgid "Parsing..."
msgstr "解析中..."
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/native/src/app/(auth)/register.tsx
#: apps/web/src/components/auth-form.tsx
msgid "Password"
msgstr "密码"
#: apps/native/src/app/(auth)/login.tsx
#: apps/native/src/app/(auth)/register.tsx
msgid "Password is required"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Password must be at least 8 characters"
msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Password updated"
msgstr "密码已更新"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Passwords do not match"
msgstr "两次密码不一致"
@@ -1716,6 +1882,14 @@ msgstr "未找到该人物"
msgid "Play trailer"
msgstr "播放预告片"
#: apps/native/src/app/title/[id].tsx
msgid "Play trailer for {titleName}"
msgstr ""
#: apps/native/src/app/change-password.tsx
msgid "Please confirm your password"
msgstr ""
#: apps/native/src/hooks/use-server-connection.ts
msgid "Please sign in again."
msgstr ""
@@ -1734,6 +1908,11 @@ msgstr "热门电视剧"
msgid "Pre-restore backup"
msgstr "还原前备份"
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
msgid "Primary"
msgstr ""
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/components/search/recently-viewed-row-content.tsx
#: apps/web/src/components/people/person-hero.tsx
@@ -1804,6 +1983,10 @@ msgstr "快捷操作"
msgid "Radarr List URL"
msgstr "Radarr 列表 URL"
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rate {star, plural, one {# star} other {# stars}}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#~ msgid "Rated {0} {1, plural, one {star} other {stars}}"
#~ msgstr ""
@@ -1827,6 +2010,7 @@ msgstr "已评 {stars, plural, other {# 星}}"
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/people/filmography-grid.tsx
#: apps/web/src/components/titles/star-rating.tsx
msgid "Rating"
msgstr "评分"
@@ -1836,6 +2020,10 @@ msgstr "评分"
msgid "Rating removed"
msgstr "评分已删除"
#: apps/native/src/components/ui/star-rating.tsx
msgid "Rating: {rating} out of 5 stars"
msgstr ""
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -1920,6 +2108,10 @@ msgstr "注册已关闭"
msgid "Registration Closed"
msgstr "注册已关闭"
#: apps/web/src/components/auth-form.tsx
msgid "Registration failed"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/web/src/components/settings/registration-section.tsx
msgid "Registration opened"
@@ -1931,7 +2123,10 @@ msgstr "注册已开放"
msgid "Remove"
msgstr "移除"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/native/src/components/ui/poster-card.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library"
msgstr "从媒体库中移除"
@@ -1939,14 +2134,18 @@ msgstr "从媒体库中移除"
#: apps/native/src/components/dashboard/continue-watching-card.tsx
#: apps/native/src/components/dashboard/upcoming-row.tsx
#: apps/native/src/components/ui/poster-card.tsx
msgid "Remove from Library"
msgstr "从媒体库中移除"
#~ msgid "Remove from Library"
#~ msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/titles/status-button.tsx
msgid "Remove from library?"
msgstr "从媒体库中移除?"
#: apps/web/src/components/command-palette.tsx
msgid "Remove from recent searches"
msgstr ""
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Remove Photo"
msgstr "删除照片"
@@ -2133,6 +2332,10 @@ msgstr "搜索…"
msgid "Season {seasonNumber}"
msgstr "第 {seasonNumber} 季"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Season {sn}"
msgstr ""
#: apps/native/src/hooks/use-title-actions.ts
#: apps/native/src/lib/title-actions.ts
msgid "Season watched"
@@ -2164,6 +2367,7 @@ msgstr "服务器"
msgid "Server Health"
msgstr "服务器健康状态"
#: apps/native/src/app/(auth)/server-url.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
msgid "Server URL"
msgstr "服务器 URL"
@@ -2188,6 +2392,7 @@ msgstr "设置您偏好的质量配置和根文件夹"
#: apps/native/src/components/navigation/native-tab-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/settings-shell.tsx
msgid "Settings"
msgstr "设置"
@@ -2212,15 +2417,17 @@ msgstr "收起"
msgid "Show more"
msgstr "展开"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign in"
msgstr "登录"
#: apps/native/src/app/(auth)/login.tsx
#: apps/web/src/components/landing-page.tsx
msgid "Sign In"
msgstr "登录"
#~ msgid "Sign In"
#~ msgstr ""
#: apps/web/src/routes/_auth/register.tsx
msgid "Sign in instead"
@@ -2245,6 +2452,10 @@ msgid "Sign in with {providerName}"
msgstr "使用 {providerName} 登录"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/web/src/components/nav-bar.tsx
#: apps/web/src/components/settings/account-section.tsx
@@ -2255,9 +2466,10 @@ msgstr "退出登录"
#: apps/native/src/app/(tabs)/(settings)/index.tsx
#: apps/native/src/components/header-avatar.tsx
#: apps/native/src/components/header-avatar.tsx
msgid "Sign Out"
msgstr "退出登录"
#~ msgid "Sign Out"
#~ msgstr ""
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Sign out of other sessions"
@@ -2292,6 +2504,7 @@ msgstr "当您看完电影或剧集时,Sofa 将自动记录"
#: apps/native/src/app/change-password.tsx
#: apps/native/src/app/person/[id].tsx
#: apps/native/src/app/title/[id].tsx
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/route-error.tsx
#: apps/web/src/components/settings/account-section.tsx
#: apps/web/src/routes/__root.tsx
@@ -2311,6 +2524,10 @@ msgstr "出现错误…"
msgid "Sonarr List URL"
msgstr "Sonarr 列表 URL"
#: apps/web/src/components/people/filmography-grid.tsx
msgid "Sort filmography"
msgstr ""
#: apps/web/src/components/dashboard/stats-section.tsx
msgid "Start exploring"
msgstr "开始探索"
@@ -2506,10 +2723,11 @@ msgid "Trailer"
msgstr "预告片"
#: apps/web/src/components/explore/hero-banner.tsx
msgid "Trending today"
msgstr "今日热门"
#~ msgid "Trending today"
#~ msgstr ""
#: apps/native/src/app/(tabs)/(explore)/index.tsx
#: apps/web/src/components/explore/hero-banner.tsx
#: apps/web/src/routes/_app/explore.tsx
msgid "Trending Today"
msgstr "今日热门"
@@ -2554,6 +2772,10 @@ msgstr "未知"
msgid "unlimited"
msgstr "无限制"
#: apps/web/src/components/titles/title-seasons.tsx
msgid "Unmark episode {epNum}"
msgstr ""
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Unreachable"
msgstr "无法访问"
@@ -2578,6 +2800,10 @@ msgstr "已将 {seasonLabel} 全部标记为未看"
msgid "Unwatched S{seasonNum} E{epNum}"
msgstr "第 {seasonNum} 季第 {epNum} 集已取消标记"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Unwatched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/continue-watching-banner.tsx
#: apps/web/src/components/dashboard/continue-watching-card.tsx
msgid "Up next"
@@ -2618,13 +2844,14 @@ msgstr "已开启自动更新检查"
msgid "Update failed"
msgstr "更新失败"
#: apps/native/src/app/change-password.tsx
#: apps/web/src/components/settings/account-section.tsx
msgid "Update password"
msgstr "修改密码"
#: apps/native/src/app/change-password.tsx
msgid "Update Password"
msgstr "修改密码"
#~ msgid "Update Password"
#~ msgstr ""
#: apps/web/src/components/settings/backup-restore-section.tsx
#: apps/web/src/components/settings/imports-section.tsx
@@ -2663,6 +2890,18 @@ msgstr "上传头像"
msgid "URL copied to clipboard"
msgstr "URL 已复制到剪贴板"
#: apps/native/src/app/(auth)/register.tsx
msgid "Use at least 8 characters"
msgstr ""
#: apps/native/src/components/header-avatar.tsx
msgid "User menu"
msgstr ""
#: apps/web/src/components/titles/title-hero.tsx
msgid "View on TMDB"
msgstr ""
#: apps/web/src/components/update-toast.tsx
msgid "View release"
msgstr "查看发布说明"
@@ -2699,20 +2938,26 @@ msgstr "观看历史"
msgid "Watch on {name}"
msgstr "在 {name} 观看"
#: apps/native/src/components/titles/season-accordion.tsx
#: apps/native/src/lib/title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched all of {seasonLabel}"
msgstr "已将 {seasonLabel} 全部标记为已看"
#: apps/native/src/lib/title-actions.ts
msgid "Watched all of {seasonName}"
msgstr "已将 {seasonName} 全部标记为已看"
#~ msgid "Watched all of {seasonName}"
#~ msgstr ""
#: apps/web/src/components/titles/use-title-actions.ts
#: apps/web/src/components/titles/use-title-actions.ts
msgid "Watched S{seasonNum} E{epNum}"
msgstr "第 {seasonNum} 季第 {epNum} 集已标记为已看"
#: apps/native/src/components/titles/season-accordion.tsx
msgid "Watched S{sNum} E{eNum}"
msgstr ""
#: apps/native/src/components/titles/status-action-button.tsx
#: apps/web/src/components/dashboard/upcoming-item.tsx
#: apps/web/src/components/title-card.tsx
@@ -2741,6 +2986,10 @@ msgstr ""
msgid "Wednesday"
msgstr "星期三"
#: apps/web/src/components/settings/system-health-section.tsx
msgid "Weekly on {dayName}"
msgstr ""
#: apps/web/src/components/auth-form.tsx
#: apps/web/src/components/dashboard/welcome-header.tsx
msgid "Welcome back"
@@ -2789,3 +3038,8 @@ msgstr "您的媒体库为空"
#: apps/native/src/app/(auth)/register.tsx
msgid "Your name"
msgstr "您的姓名"
#: apps/web/src/components/auth-form.tsx
msgid "Your name…"
msgstr ""