{ "common": { "resetSortAria": "Reset sort to default", "save": "Save", "cancel": "Cancel", "delete": "Delete", "edit": "Edit", "close": "Close", "confirm": "Confirm", "loading": "Loading...", "search": "Search", "back": "Back", "next": "Next", "previous": "Previous", "retry": "Retry", "yes": "Yes", "no": "No", "show": "Show", "hide": "Hide", "undo": "Undo", "pagination": { "label": "Pagination", "pageOf": "Page {page} of {totalPages}", "previousPage": "Previous page", "nextPage": "Next page", "goToPage": "Go to page {page}" } }, "settings": { "privacySharing": { "title": "Privacy & Sharing", "subtitle": "Control whether administrators can see an identifiable summary of your reading activity.", "levelLegend": "Reading insights sharing level", "current": "Current setting", "levels": { "private": { "title": "Private", "description": "Only you can see your reading statistics." }, "summary": { "title": "Share summary", "description": "Share aggregate habits without book titles, authors, series, or narrators." }, "detailed": { "title": "Share detailed insights", "description": "Also share recent and top books, authors, series, genres, and narrators." } }, "fields": { "frequency": "Reading frequency and active days", "completion": "Aggregate books started and completed", "formats": "Format distribution", "genres": "Broad genre distribution", "trend": "Aggregate reading trend", "books": "Current, recent, and most-read book titles", "authors": "Top authors", "series": "Top series", "narrators": "Top narrators" }, "confirm": { "shareTitle": "Enable {level}?", "shareDescription": "Administrators with permission will be able to see the following information.", "stopTitle": "Stop sharing reading insights?", "stopDescription": "Administrator access will be blocked immediately. Existing access records remain in your history.", "recordedNotice": "Each administrator profile view is recorded and appears in your access history." }, "preview": { "title": "Preview your shared profile", "description": "See the information currently available to authorized administrators.", "action": "Load preview", "readingTime": "Reading time", "activeDays": "Active days", "started": "Books started", "completed": "Books completed", "topBooks": "Top books" }, "history": { "title": "Profile access history", "description": "Recent administrator views of your shared reading profile.", "empty": "No administrator has viewed your shared reading profile.", "paginationLabel": "Profile access history pages" }, "durationMinutes": "{count, plural, one {# minute} other {# minutes}}", "durationHours": "{count, plural, one {# hour} other {# hours}}", "unknownTitle": "Untitled book", "errors": { "load": "Failed to load sharing settings.", "save": "Failed to update sharing settings.", "preview": "Failed to load the shared-profile preview." } }, "appearance": { "language": { "title": "Language", "description": "Choose the language used across the interface.", "label": "Language", "loadError": "Failed to load the selected language", "saveError": "Failed to save language preference" }, "pageTitle": "Display", "pageSubtitle": "Control themes, covers, layout, and how your library is presented.", "mobileSummary": "Theme: {theme} • Accent: {accent} • Background: {background}", "themeMode": { "light": "Light", "dark": "Dark", "system": "System" }, "theme": { "title": "Theme", "style": { "label": "Style", "hint": "The overall look of the app. Mode, accent, corners and background keep their settings.", "bookorbit": { "label": "BookOrbit", "description": "Tinted surfaces, glass panels and serif headings." }, "nostalgia": { "label": "Nostalgia", "description": "Neutral grounds, system type, flat panels and a top glow." } }, "colorScheme": { "label": "Color scheme", "hint": "Light or dark interface" }, "surfacePalette": { "label": "Surface", "hint": "The neutral ground behind panels and cards.", "palettes": { "onyx": "Onyx", "carbon": "Carbon", "neutral": "Neutral", "zinc": "Zinc", "iron": "Iron", "steel": "Steel", "ash": "Ash", "smoke": "Smoke", "charcoal": "Charcoal", "slate": "Slate", "midnight-blue": "Midnight blue", "ocean": "Ocean", "pine": "Pine", "olive": "Olive", "stone": "Stone", "sepia": "Sepia", "crimson": "Crimson", "plum": "Plum" } }, "topGlow": { "label": "Top glow", "hint": "How far the accent glow reaches down the page. Slide all the way left to turn it off.", "value": "{value}%", "off": "Off" }, "accents": { "grey": "Grey", "scarlet": "Scarlet", "vermilion": "Vermilion", "rose": "Rose", "copper": "Copper", "orange": "Orange", "chartreuse": "Chartreuse", "marigold": "Marigold", "wasabi": "Wasabi", "amber": "Amber", "malachite": "Malachite", "yellow": "Yellow", "viridian": "Viridian", "turquoise": "Turquoise", "lime": "Lime", "green": "Green", "acid-green": "Acid Green", "emerald": "Emerald", "teal": "Teal", "electric-blue": "Electric Blue", "cyan": "Cyan", "jade": "Jade", "ultramarine": "Ultramarine", "iris": "Iris", "purple": "Purple", "blue": "Blue", "indigo": "Indigo", "violet": "Violet", "amethyst": "Amethyst", "fuchsia": "Fuchsia", "raspberry": "Raspberry", "pink": "Pink", "white": "White", "rosewater": "Rosewater", "salmon": "Salmon", "coral": "Coral", "sand": "Sand", "peach": "Peach", "pear": "Pear", "flax": "Flax", "sprout": "Sprout", "butter": "Butter", "aloe": "Aloe", "lemon": "Lemon", "foam": "Foam", "aqua": "Aqua", "celadon": "Celadon", "sage": "Sage", "pistachio": "Pistachio", "mint": "Mint", "seafoam": "Seafoam", "baby-blue": "Baby Blue", "powder": "Powder", "sea-glass": "Sea Glass", "bluebell": "Bluebell", "cornflower": "Cornflower", "thistle": "Thistle", "periwinkle": "Periwinkle", "wisteria": "Wisteria", "lavender": "Lavender", "mauve": "Mauve", "orchid": "Orchid", "rose-quartz": "Rose Quartz", "blush": "Blush" }, "accentColor": { "label": "Accent color", "hint": "Controls highlights and interactive elements" }, "cornerRadius": { "label": "Corner radius", "hint": "Roundness of cards and UI elements", "options": { "sharp": "Sharp", "default": "Default", "rounded": "Rounded", "pill": "Pill" } }, "surfaceBrightness": { "label": "Surface brightness", "hint": "Lighten dark mode surfaces", "reset": "Reset" }, "libraryBackground": { "title": "Library Background", "pattern": { "label": "Background pattern", "hint": "Pattern shown behind the book grid" } }, "backgroundGroups": { "fundamental": "Fundamental", "structural": "Structural", "ambient": "Ambient", "refractive": "Refractive" }, "syncSaveFailed": "Failed to save theme preferences" }, "storage": { "title": "Where to save appearance preferences", "active": "Active", "notAvailable": "Not available", "device": { "title": "This device only", "description": "Preferences stay in your browser. Best if you want a different look on different devices." }, "account": { "title": "My account", "description": "Preferences are saved to your account. Best if you want the same appearance on every device." }, "toasts": { "synced": "Preferences will now be synced", "local": "Preferences will stay on this device" }, "errors": { "demoRestricted": "Demo-restricted account cannot change theme storage mode", "update": "Failed to update storage mode", "generic": "An error occurred while updating storage mode" } }, "bookCovers": { "title": "Book Covers", "coverSearch": { "label": "Default cover search provider", "hint": "Choose the source selected when Find cover online opens. Saved to your account, so it applies on every device.", "loadError": "Failed to load the default cover search provider", "saveError": "Failed to save the default cover search provider" }, "placeholderStyle": { "title": "Placeholder style", "hint": "Books without cover art are drawn in this style.", "options": { "bauhaus": "Bauhaus", "constructivist": "Constructivist", "memphis": "Memphis", "clothbound": "Clothbound", "poster": "Poster", "aurora": "Aurora", "vista": "Vista", "marbled": "Marbled", "paperback": "Paperback" } }, "displayMode": { "title": "Cover display mode", "hint": "Controls how real covers fit inside book slots when aspect ratios differ", "blurredFit": { "label": "Blurred fit", "hint": "Show the full cover with a blurred fill behind it" }, "fillCrop": { "label": "Fill card", "hint": "Fill the entire slot by cropping edges when aspect ratios differ" }, "naturalBottom": { "label": "Natural bottom", "hint": "Keep the original cover ratio and anchor the cover to the bottom" } }, "spine": { "title": "Book spine overlay", "hint": "Adds a stylized spine and gloss effect to cover cards", "off": { "label": "Off", "hint": "No spine/gloss effect on covers" }, "subtle": { "label": "Subtle", "hint": "Light spine and sheen, closer to the default look" }, "strong": { "label": "Strong", "hint": "More pronounced spine and gloss treatment" } }, "showSpineOnComics": { "label": "Show spine on comics", "hint": "Apply the spine and gloss effect to comic covers (cbz, cbr, cb7)" }, "detailCoverTint": { "title": "Book details cover tint", "hint": "Fades colour sampled from the cover behind the artwork and title on the book details page", "off": { "label": "Off", "hint": "Plain card background" }, "single": { "label": "One colour", "hint": "The cover's dominant colour only" }, "duotone": { "label": "Two colours", "hint": "Adds the cover's accent colour when it has a distinct one" } }, "shadow": { "title": "Cover shadow strength", "hint": "Controls depth under covers across grid, list, table, and dashboard thumbnails", "default": { "label": "Default", "hint": "Current elevation and depth" }, "strong": { "label": "Strong", "hint": "Heavier shelf-like drop shadow under covers" } }, "overlays": { "title": "Card overlays", "hint": "Choose metadata shown directly on book cover cards", "progressBar": { "label": "Progress bar", "hint": "Thin colored line along the bottom edge" }, "format": { "label": "File format", "hint": "Color-coded EPUB, PDF, CBZ badge at bottom-right" }, "rating": { "label": "Rating", "hint": "Star rating indicator at bottom-left" }, "readStatus": { "label": "Read status", "hint": "Color icon showing the current reading status at top-left" }, "seriesPosition": { "label": "Series number", "hint": "Badge showing the book position in its series at top-right (e.g. #3, #1.5)" }, "lockStatus": { "label": "Lock status", "hint": "Metadata lock icon at top-right - orange when locked, green when unlocked" } } }, "layout": { "coverSize": "Cover size", "gridSpacing": "Grid spacing", "gridLayout": { "title": "Library Grid Layout" }, "coverSizeBehavior": { "label": "Cover size behavior", "hint": "Control whether portrait/square sizes and grid spacing are shared across all views or kept per-view", "perViewHint": "Per-view mode: adjust cover size and spacing from each view's Display panel.", "syncAll": "Sync all views", "perView": "Per-view sizes" }, "portraitCoverSize": { "label": "Portrait cover size", "hint": "Used for portrait libraries and views" }, "squareCoverSize": { "label": "Square cover size", "hint": "Used for square libraries and views" }, "portraitGridSpacing": { "label": "Portrait grid spacing", "hint": "Gap between portrait covers" }, "squareGridSpacing": { "label": "Square grid spacing", "hint": "Gap between square covers" }, "cardInfoMode": { "label": "Card info mode", "hint": "Where to show book title and author on grid cards", "onHover": "On hover", "belowCover": "Below cover", "off": "Off" }, "primaryCardLabel": { "label": "Primary card label", "hint": "Text shown below each book cover (first line)" }, "secondaryCardLabel": { "label": "Secondary card label", "hint": "Additional text below the primary label (second line)" }, "labelField": { "hidden": "Hidden", "bookTitle": "Book title", "seriesTitle": "Series title", "seriesTitlePosition": "Series title + position", "author": "Author" }, "seriesDisplay": { "title": "Series Display", "collapsedCover": { "label": "Collapsed series cover", "hint": "Choose which cover to show when series are collapsed in the book grid" }, "stack": "Stack", "mosaic": "Mosaic", "first": "First", "latest": "Latest", "firstUnread": "First Unread" }, "authorGrid": { "title": "Author Grid", "coverSize": { "label": "Cover size", "hint": "Width of author covers in the grid" }, "coverShape": { "label": "Cover shape", "hint": "Shape of author covers in the grid" }, "circle": "Circle", "square": "Square" }, "listTableViews": { "title": "List and Table Views" }, "zebraStriping": { "label": "Zebra striping", "hint": "Alternate row background colors for easier scanning" } }, "behavior": { "title": "Library Behavior", "thumbnailClicks": { "label": "Thumbnail clicks", "hint": "Choose what happens when opening a book from grid and list views", "readFirst": "Read first", "readFirstHint": "Open the reader when a readable file exists", "openDetails": "Open details", "openDetailsHint": "Go to the book details page from grid and list thumbnails" }, "filterPreview": { "label": "Show filter preview by default", "hint": "Expand the active filter and sort summary when opening a smartScope" }, "collapseSeries": { "label": "Collapse series by default", "hint": "Group books in the same series into a single card in library and collection views" }, "bookRequests": { "label": "Show Book Requests", "hint": "Show request pages, prompts, and settings in this account. Existing requests keep running when hidden.", "saveFailed": "Could not update Book Requests visibility" } }, "icons": { "title": "Custom Icons", "uploadIcons": "Upload icons", "uploadedCount": "{count, plural, =0 {no icons uploaded} one {# icon uploaded} other {# icons uploaded}}", "searchPlaceholder": "Search icons", "sort": { "newest": "Newest", "name": "Name" }, "selectedCount": "{count, plural, one {# selected} other {# selected}}", "clear": "Clear", "deleteSelected": "Delete selected", "loading": "Loading icons...", "emptySearch": "No icons match your search.", "emptyNoIcons": "No custom icons uploaded yet.", "namePlaceholder": "Name", "checkingUsage": "Checking usage...", "usedBy": "Used by {count}", "notUsedYet": "Not used yet", "rename": "Rename", "replace": "Replace", "usage": { "libraries": "{count, plural, =0 {no libraries} one {# library} other {# libraries}}", "collections": "{count, plural, =0 {no collections} one {# collection} other {# collections}}", "smartScopes": "{count, plural, =0 {no smart scopes} one {# smart scope} other {# smart scopes}}" }, "confirm": { "deleteOne": "Delete \"{name}\"? Existing uses will fall back to their default icon.", "deleteMany": "{count, plural, =0 {Delete no icons?} one {Delete # icon? Existing uses will fall back to their default icon.} other {Delete # icons? Existing uses will fall back to their default icon.}}" }, "toasts": { "saved": "Icon saved", "updated": "Icon updated", "deleted": "Icon deleted", "bulkDeleted": "{count, plural, =0 {Deleted no icons} one {Deleted # icon} other {Deleted # icons}}", "bulkDeletePartial": "Deleted {deleted}, {failed} failed" }, "errors": { "load": "Failed to load icons", "save": "Failed to save icon", "replace": "Failed to replace icon", "delete": "Failed to delete icon", "bulkDelete": "Failed to delete icons" } }, "tabs": { "theme": "Theme", "book-covers": "Book Covers", "icons": "Icons", "layout": "Layout", "behavior": "Behavior", "language": "Language" } }, "account": { "title": "Account", "subtitle": "Manage your personal profile settings.", "subtitleAll": "Manage your profile and notification preferences.", "tabs": { "profile": "Profile", "privacy": "Privacy & Sharing", "notifications": "Notifications", "restrictions": "Restrictions" }, "demoRestricted": { "cannotEdit": "Demo-restricted account cannot edit account settings", "notice": "Demo-restricted account: editing profile, password, avatar, and linked identities is disabled." }, "feedback": { "unsavedChanges": "Unsaved changes", "discard": "Discard" }, "profile": { "securityHeading": "Profile & Security", "username": "Username", "fullName": "Full name", "email": "Email", "emailHint": "Contact an administrator to change your email address.", "save": "Save profile", "saving": "Saving...", "changePassword": "Change password", "accountType": "Account type:", "accountTypeOidc": "OIDC / SSO", "accountTypeShared": "Shared", "accountTypeLocal": "Local", "nameRequired": "Name is required", "updateFailed": "Failed to update profile", "updated": "Profile updated", "usernameHint": "Your username cannot be changed.", "passwordHint": "Change the password you use to sign in.", "passwordHintOidc": "Your password is managed by your identity provider.", "passwordHintShared": "Shared accounts sign in through a magic link and have no password." }, "readingPreferences": { "title": "Reading Preferences", "timezoneHint": "Timezone is used for time-sensitive achievements like Early Bird and All-nighter.", "timezone": "Timezone", "save": "Save preferences", "enableAchievements": "Enable achievements", "enableAchievementsHint": "Track achievement progress and show achievement-related interface. Manage achievement notifications separately in Notifications.", "achievementsEnabled": "Achievements enabled", "achievementsDisabled": "Achievements disabled", "achievementsSaveFailed": "Failed to update the achievement preference" }, "preferences": { "saveFailed": "Failed to save preferences", "saved": "Preferences saved" }, "avatar": { "title": "Profile Picture", "unknownUser": "Unknown user", "formatHint": "PNG/JPEG/WEBP up to {size} MB", "upload": "Upload picture", "replace": "Replace picture", "uploading": "Uploading...", "remove": "Remove picture", "removing": "Removing...", "updated": "Profile picture updated", "uploadFailed": "Failed to upload profile picture", "removed": "Profile picture removed", "removeFailed": "Failed to remove profile picture", "removeConfirm": { "title": "Remove profile picture?", "description": "Your avatar will be removed and replaced with initials.", "confirm": "Remove" } }, "connectedAccounts": { "title": "Connected Accounts", "unlink": "Unlink", "unlinking": "Unlinking...", "linkAdditional": "Link additional providers:", "linkProvider": "Link {provider}", "redirecting": "Redirecting...", "noneConfigured": "No OIDC providers are configured. Ask an administrator to set up SSO.", "linkStateFailed": "Failed to generate link state", "startLinkFailed": "Failed to start OIDC link", "unlinkFailed": "Failed to unlink", "unlinked": "Identity unlinked", "unlinkIdentityFailed": "Failed to unlink identity", "unlinkDialog": { "title": "Unlink {provider} identity?", "description": "Enter your password to confirm. You will no longer be able to sign in with this provider.", "currentPassword": "Current password" }, "description": "Sign in with an external identity provider linked to this account.", "unlinkAria": "Unlink {provider}" }, "tour": { "title": "Guided Tour", "description": "Replay the walkthrough that highlights key features of the app.", "action": "Take the tour again" }, "restrictions": { "none": { "title": "No content restrictions", "description": "Your account has full access to all content within your assigned libraries." }, "banner": "Your account has content restrictions applied by an administrator. Some books may not be visible to you.", "allowedTags": { "title": "Allowed tags", "description": "Only books that have at least one of these tags are shown to you." }, "blockedTags": { "title": "Blocked tags", "description": "Books with any of these tags are hidden from you." }, "allowedGenres": { "title": "Allowed genres", "description": "Only books that have at least one of these genres are shown to you." }, "blockedGenres": { "title": "Blocked genres", "description": "Books with any of these genres are hidden from you." } }, "groups": { "profile": "Profile", "preferences": "Preferences", "security": "Security & access" } }, "magicLinks": { "title": "Magic Links", "subtitle": "Create shareable login links for shared accounts.", "createLink": "Create link", "noSharedAccounts": "No shared accounts found", "noSharedAccountsHint": "Create a shared account from the {usersPage} first to generate magic links.", "activeLinks": "Active links", "inactiveLinks": "Inactive links", "paused": "Paused", "deletedUser": "Deleted user", "expiredPrefix": "Expired ", "never": "No recorded activity", "noExpiry": "No expiry", "expired": "Expired", "expiresOn": "Expires {date}", "revokedOn": "Revoked {date}", "expiredOn": "Expired {date}", "usesCount": "{count, plural, =0 {no uses} one {one use} other {# uses}}", "copied": "Copied!", "copyLink": "Copy link", "pause": "Pause", "resume": "Resume", "revoke": "Revoke", "revoking": "Revoking...", "emptyState": "No magic links created yet. Click \"{action}\" to generate a shareable login URL.", "columns": { "label": "Label", "account": "Account", "createdBy": "Created by", "expires": "Expires", "uses": "Uses", "created": "Created", "status": "Status", "totalUses": "Total uses", "actions": "Actions" }, "createDialog": { "title": "Create magic link", "description": "Generate a shareable login URL for a shared account.", "sharedAccount": "Shared account", "selectAccount": "Select a shared account", "label": "Label", "labelPlaceholder": "e.g. Demo link for conference", "expiresAt": "Expires at", "optional": "(optional)", "create": "Create", "creating": "Creating..." }, "revokeDialog": { "title": "Revoke magic link?", "description": "This will immediately invalidate the link and terminate all active sessions for the linked account." }, "errors": { "create": "Failed to create", "copy": "Failed to copy magic link", "update": "Failed to update magic link", "revoke": "Failed to revoke" }, "usersPage": "Users page", "emptyTitle": "No magic links created yet", "emptyHint": "Click \"{action}\" to generate a shareable login URL.", "noActiveTitle": "No active magic links", "noActiveHint": "All generated magic links for this page have expired or been revoked.", "copyLinkAria": "Copy the link for {label}", "pauseAria": "Pause {label}", "resumeAria": "Resume {label}", "revokeAria": "Revoke {label}", "lastUsedLabel": "Last used {date}" }, "oidc": { "title": "OIDC / SSO", "subtitle": "Manage OpenID Connect providers for single sign-on.", "providers": "Providers", "addProvider": "Add Provider", "editProvider": "Edit Provider", "configureNew": "Configure a new OIDC provider.", "editing": "Editing {slug}", "enabled": "Enabled", "disabled": "Disabled", "empty": { "title": "No providers yet", "description": "Add an OIDC provider to enable single sign-on for your users." }, "form": { "status": "Status", "enableProvider": "Enable provider", "enableProviderHint": "Show this provider on the login page.", "identity": "Provider Identity", "slug": "Slug", "slugHint": "Unique identifier (lowercase, hyphens). Cannot be changed later.", "displayName": "Display Name", "displayNameHint": "Shown on the login button.", "iconUrl": "Icon URL", "iconUrlHint": "Optional logo shown next to the login button.", "iconPreviewAlt": "icon preview", "connection": "Connection", "issuerUri": "Issuer URI", "issuerUriHint": "The provider's base URL.", "test": "Test", "testing": "Testing...", "clientId": "Client ID", "clientSecret": "Client Secret", "clientSecretPlaceholder": "Leave blank to keep existing", "scopes": "Scopes", "claimMapping": "Claim Mapping", "previewClaims": "Preview claims", "redirecting": "Redirecting...", "mappedClaims": "Mapped claims", "rawClaims": "Raw claims", "usernameClaim": "Username claim", "nameClaim": "Name claim", "emailClaim": "Email claim", "groupsClaim": "Groups claim", "autoProvisioning": "Auto-Provisioning", "autoProvisionUsers": "Auto-provision users", "autoProvisionUsersHint": "Create accounts on first OIDC login if user does not exist.", "allowLocalLinking": "Allow local account linking", "allowLocalLinkingHint": "Link OIDC identity to an existing local account by username match.", "defaultPermissions": "Default permissions", "defaultPermissionsHint": "Permissions granted to new users on first OIDC login.", "createProvider": "Create Provider", "saveChanges": "Save Changes", "saving": "Saving...", "deleteProvider": "Delete Provider", "deleting": "Deleting..." }, "test": { "connected": "Connected - {issuer}", "connectionFailed": "Connection failed", "privateIssuerAddress": "The issuer URL resolves to a private or local network address, so the server refused to connect. Set OIDC_ALLOW_LOCAL_ISSUERS=true on the BookOrbit server to allow it.", "tlsCertificateUntrusted": "BookOrbit could not verify the OIDC provider's TLS certificate. If the provider uses a private certificate authority, mount its PEM CA bundle, set NODE_EXTRA_CA_CERTS to the bundle's in-container path, and restart BookOrbit.", "hide": "Hide", "details": "Details", "supported": "supported", "notSupported": "not supported" }, "groupMappings": { "title": "Group Mappings", "description": "Map OIDC group claims to BookOrbit permissions. Synced on every login.", "noPermission": "No permission", "empty": "No group mappings configured.", "addMapping": "Add mapping", "claimPlaceholder": "OIDC group claim (e.g. admins)", "add": "Add", "adding": "Adding..." }, "toasts": { "providerCreated": "Provider created", "providerSaved": "Provider saved", "providerDeleted": "Provider deleted", "mappingAdded": "Group mapping added", "mappingRemoved": "Group mapping removed" }, "errors": { "loadProvider": "Failed to load provider", "createProvider": "Failed to create provider", "save": "Failed to save", "delete": "Failed to delete", "deleteProvider": "Failed to delete provider", "requestFailed": "Request failed", "previewState": "Failed to generate preview state", "startPreview": "Failed to start preview", "addMapping": "Failed to add mapping", "removeMapping": "Failed to remove group mapping" } }, "admin": { "title": "Admin", "subtitle": "Manage users and authentication settings.", "system": { "title": "System", "subtitle": "File organization, ingestion, and maintenance settings." }, "maintenance": { "title": "Maintenance", "subtitle": "Manage background tasks, system indices, and maintenance operations.", "importGroup": "Import", "recommendationsGroup": "Recommendations", "achievementsGroup": "Achievements", "updatesGroup": "Updates", "importFromBooklore": "Import from Booklore", "bookloreImportConfigured": "Booklore import configured", "importLibraryData": "Import library data", "migrationConfigured": "Migration source configured", "migrationRunning": "Migration running", "migrationCompleted": "Migration completed", "migrationFailed": "Migration failed", "importDescription": "One-time import of books, metadata, and reading progress from a previous Booklore installation.", "migrationDescription": "One-time import of books, metadata, and reading progress from another library application.", "configuredDescription": "Source: {name}. No migration run yet - continue setup to run the import.", "runningDescription": "Stage: {stage} - started {started}", "completedDescription": "From {name} - completed {date}", "migrationErrorGeneric": "An error occurred during migration.", "stageInitializing": "initializing", "recently": "recently", "getStarted": "Get Started", "continueSetup": "Continue Setup", "viewDetails": "View Details", "refreshRecommendationIndex": "Refresh recommendation index", "refreshRecommendationHint": "Update the recommendations engine with your latest library changes. This process runs in the background.", "booksQueuedForProcessing": "{count, plural, =0 {no books queued for processing} one {# book queued for processing} other {# books queued for processing}}", "run": "Run", "running": "Running...", "backfillAchievements": "Backfill achievements", "backfillAchievementsHint": "Re-evaluate achievements across all users.", "backfillResult": "Processed {users} users; granted {awards} awards.", "runBackfill": "Run Backfill", "checkForUpdates": "Check for updates", "checkForUpdatesHint": "Automatically check GitHub for a new release on startup and show an indicator in the sidebar when one is available.", "updateChecksEnabled": "Update checks enabled", "updateChecksDisabled": "Update checks disabled", "updateSettingFailed": "Failed to update setting", "booksQueuedForEmbedding": "{count, plural, =0 {no books queued for embedding} one {# book queued for embedding} other {# books queued for embedding}}", "failed": "Failed", "unknownError": "Unknown error", "rebuildEmbeddingsFailed": "Failed to rebuild embeddings: {error}", "achievementBackfillConfirm": "Run achievement backfill for all achievements across all users? This may take a while.", "achievementBackfillComplete": "Achievement backfill complete: {count} awards granted", "backfillRunFailed": "Failed to run backfill", "achievementBackfillFailed": "Failed to run achievement backfill: {error}", "uploadsGroup": "Uploads", "maxUploadSize": "Maximum upload file size limit", "maxUploadSizeHint": "Configure the maximum size limit for file uploads across the system.", "save": "Save", "uploadSizeInvalid": "Upload size limit must be greater than 0", "uploadSizeUpdated": "Upload size limit updated" }, "migration": { "title": "Migration", "subtitle": "One-time Booklore import: connect source, map users, dry-run, start migration, and export a report.", "genericSubtitle": "One-time library import: connect a source, map users, run a dry run, start migration, and export a report.", "progress": "Progress", "stepSourceConnection": "Source Connection", "stepUserPathMapping": "User & Path Mapping", "stepDryRun": "Dry-Run", "stepDryRunTitle": "Dry Run", "stepRunMigration": "Run Migration", "stepReport": "Report", "stepReportTitle": "Migration Report", "subtitleSource": "Configure the database connection to your source Booklore instance.", "genericSubtitleSource": "Configure the connection to your source library application.", "subtitleMappings": "Map source users to target users and translate file paths.", "subtitleDryRun": "Preview what will be imported before running the live migration.", "subtitleRun": "Start the live import and monitor its progress.", "subtitleReport": "Review what was imported and export a detailed report.", "continueToMappings": "Continue to Mappings", "continueToDryRun": "Continue to Dry Run", "continueToMigration": "Continue to Migration", "viewReport": "View Report", "badgeValidated": "Validated", "badgeSaved": "Saved", "badgeUpToDate": "Up to date", "badgeCompleted": "Completed", "badgeRunning": "Running", "badgeFailed": "Failed", "mediaPathRequired": "Required for migrating book covers.", "mediaPathAbsolute": "Use an absolute path (for example: /books). Relative paths are not supported.", "mediaPathConfigured": "Cover import path configured. Use Test Connection to verify access and Booklore images folder structure.", "issueSaveSource": "Save source connection settings", "issueValidateSource": "Validate source connection", "issueSaveMappings": "Save user and path mappings", "issueSavePathMappings": "Save path mappings to validate them", "issueFreshDryRun": "Run a fresh dry-run", "issueResolveDuplicates": "Resolve duplicate target book matches in the dry-run", "issueWaitActiveRun": "Wait for active run to finish", "sourceRecordId": "Source record ID #{id}", "byAuthorWithId": "by {author} (ID: {id})", "filePathWithId": "{path} (ID: {id})", "bookloreSourceId": "Booklore source ID: {id}", "libraryBookNum": "Library book #{id}", "errorInitialize": "Failed to initialize migration settings", "errorLoadSourceTypes": "Failed to load supported migration source types", "errorLoadTargetUsers": "Failed to load target users", "errorLoadLibraryFolders": "Failed to load target library folders", "noSourceUsersReturned": "No source users were returned", "userMappingSuggestionsLoaded": "User mapping suggestions loaded", "errorLoadSuggestions": "Failed to load user mapping suggestions", "requiredFields": "Host, user, database, and source name are required", "connectionTestPassedWithWarnings": "Connection test passed with warnings", "connectionTestPassedWithCount": "Connection test passed with {count} warning(s). First: {first}", "connectionTestPassed": "Connection test passed", "connectionOkMissingTables": "Connection ok, but {count} required table(s) are missing", "cannotTestMediaPathActiveRun": "Cannot test media path while a run is active", "mediaRootPathRequiredCover": "Media Root Path is required for cover import.", "useAbsolutePath": "Use an absolute path (for example: /books).", "mediaPathVerified": "Media path verified.", "mediaPathValidReadable": "Media path is valid and readable", "mediaPathValidationFailed": "Media path validation failed.", "connectionFailedBeforeMediaPath": "Connection test failed before media path validation could complete.", "cannotModifySourceActiveRun": "Cannot modify source while a run is active", "sourceSavedValidatedWarnings": "Source saved and validated with {count} warning(s)", "sourceSavedValidated": "Source saved and validated", "errorSaveValidateSource": "Failed to save or validate source", "cannotSaveMappingsActiveRun": "Cannot save mappings while a run is active", "saveSourceFirst": "Save source first", "mapAtLeastOneUser": "Map at least one source user to a target user", "mapEveryUser": "Map every source user before saving", "pathValidationFailedProfileSaved": "Path validation failed, but profile will still be saved", "mappingsSaved": "Mappings saved", "errorSaveMappings": "Failed to save mappings", "cannotRunDryRunActiveRun": "Cannot run dry-run while a run is active", "saveMappingsFirst": "Save mappings first", "dryRunCompleted": "Dry-run completed: {matched} matched, {unresolved} unresolved", "dryRunFailed": "Dry-run failed", "selectSourceForAllGroups": "Select a source book for all {count} duplicate groups", "duplicatesResolved": "Duplicate matches resolved", "errorResolveDuplicates": "Failed to resolve duplicates", "preflightNotReady": "Migration preflight not ready", "runDryRunFirst": "Run dry-run first", "runStarted": "Migration run started", "errorStartMigration": "Failed to start migration", "runCancelled": "Migration run cancelled", "errorCancelMigration": "Failed to cancel migration", "runRetried": "Migration run retried - resuming from last completed stage", "errorRetryMigration": "Failed to retry migration", "errorLoadRunProgress": "Failed to load run progress", "startMigrationFirst": "Start migration first", "reportRefreshed": "Run report refreshed", "errorLoadReport": "Failed to load run report", "reportExported": "Report exported as {format}", "errorExportReport": "Failed to export migration report", "reasonNoTitleAuthorMatch": "No matching book found by title or author", "reasonNoFilePathMatch": "File path did not match any book in this library", "reasonNoFileHashMatch": "File hash did not match any book in this library", "reasonNoIsbnMatch": "ISBN did not match any book in this library", "reasonNoAsinMatch": "ASIN did not match any book in this library", "reasonInsufficientSourceData": "Not enough metadata to attempt matching", "reasonAmbiguousIsbnMatch": "Multiple books matched the same ISBN", "reasonAmbiguousAsinMatch": "Multiple books matched the same ASIN", "reasonAmbiguousFileHashMatch": "Multiple books matched the same file hash", "reasonAmbiguousFilePathMatch": "Multiple books matched the same file path", "reasonAmbiguousTitleAuthorMatch": "Multiple books matched the same title and author", "reasonUnknown": "Could not determine reason", "strategyIsbn": "Matched by ISBN", "strategyAsin": "Matched by ASIN", "strategyFileHash": "Matched by file hash", "strategyPathMapping": "Matched by mapped file path", "strategyTitleAuthor": "Matched by title and author", "strategyUnavailable": "Match strategy unavailable", "userPreviewCounts": "{statuses} statuses, {progress} progress entries, {bookmarks} bookmarks, {annotations} annotations, {collections} collection entries", "connErrorUnreachable": "Could not reach the database server. Check the host and port.", "connErrorAuth": "Authentication failed. Check the username and password.", "connErrorUnknownDatabase": "Database not found. Check the database name.", "connErrorTimeout": "Connection timed out. Check host and firewall settings.", "connErrorGeneric": "Connection test failed", "sourceType": "Source Type", "sourceName": "Source Name", "host": "Host", "port": "Port", "user": "User", "password": "Password", "passwordSavedPlaceholder": "Saved - leave unchanged", "passwordEmptyPlaceholder": "No password set", "database": "Database", "mediaRootPath": "Media Root Path", "pathOk": "Path OK", "pathIssue": "Path Issue", "testPath": "Test Path", "useTls": "Use TLS/SSL", "testConnection": "Test Connection", "saveAndValidate": "Save & Validate", "sourceValidatedWithWarnings": "Source validated with warnings", "lastValidationSnapshot": "Last validation snapshot", "sourceVersion": "Source version: {version}", "unknown": "Unknown", "missingRequiredTables": "Missing required tables: {tables}", "suggestionsAutoLoad": "User suggestions load automatically after source validation.", "refresh": "Refresh", "sourceUser": "Source User", "targetUser": "Target User", "doNotImport": "Do not import this user", "noSourceUsersLoaded": "No source users loaded yet.", "noActiveTargetUsers": "No active target users found. Create or re-enable a BookOrbit user before mapping.", "pathPrefixMappings": "Path Prefix Mappings", "addMapping": "Add Mapping", "pathMappingsHelp1": "Path mappings translate source file paths to target paths so books can be matched by file location. For example, if your Booklore library stored files under", "pathMappingsHelp2": "and the same files now live under", "pathMappingsHelp3": ", add that mapping here. Books are also matched by ISBN, file hash, and title/author regardless of path mappings - path mapping is only one of four strategies and does not limit which source books are included in the migration.", "noPrefixesFound": "No prefixes found - validate source first", "selectSourcePrefix": "Select source prefix...", "selectTargetFolder": "Select target folder...", "remove": "Remove", "pathValidation": "Path validation", "pathValidationMapped": "{mapped} of {total} source books have a mapped path", "pathValidationUnmatched": "{count} mapped paths not found on disk - those books will fall back to ISBN / title matching", "pathValidationAllMatched": "All {count} mapped paths found on disk", "saveMappings": "Save Mappings", "runDryRun": "Run Dry-Run", "matched": "Matched:", "unresolved": "Unresolved:", "duplicateMatches": "Duplicate matches:", "unresolvedSummary": "Unresolved summary", "resolveDuplicateMatches": "Resolve duplicate target matches", "resolveDuplicateHint": "For each target book, choose one source book to keep. Recommended choices are preselected when there is a single strongest match.", "remainingGroups": "Remaining groups:", "ofCount": "of {count}", "targetBookNum": "Target book #{id}", "recommended": "Recommended", "resolveDuplicatesButton": "{count, plural, =0 {Resolve # duplicate} one {Resolve # duplicate} other {Resolve # duplicates}}", "preflightChecks": "Preflight checks", "allChecksPassed": "All checks passed - ready to migrate", "checkSourceValidated": "Source validated", "checkSaveValidateSource": "Save and validate source connection", "checkValidateSource": "Validate source connection", "checkMappingsSaved": "Mappings saved", "checkSaveMappings": "Save user and path mappings", "checkPathMappingsValidated": "Path mappings validated", "checkSavePathMappings": "Save path mappings to validate them", "checkDryRunUpToDate": "Dry-run is up to date", "checkFreshDryRun": "Run a fresh dry-run", "startConfirmPrompt": "This will start the live migration. Are you sure?", "confirmStart": "Confirm Start", "startMigration": "Start Migration", "cancelRun": "Cancel Run", "refreshStatus": "Refresh Status", "statusPollingStopped": "Status polling stopped due to an error.", "retry": "Retry", "stageLabel": "Stage: {stage}", "stageInitializing": "initializing", "endedLabel": "Ended {date}", "stageCompleted": "Completed", "stageInit": "Initializing", "stageSharedOverlays": "Importing metadata", "stageBookCovers": "Importing covers", "stageUserState": "Importing user data", "noRunYet": "No migration run yet. Complete the steps above to start.", "runNum": "Run #{id}", "notStarted": "Not started", "reloadReport": "Reload Report", "loadFullReport": "Load Full Report", "exportJson": "Export JSON", "exportCsv": "Export CSV", "migrationFailed": "Migration failed", "retryFromLastStage": "Retry from last completed stage", "booksCard": "Books", "metadataOverlaysApplied": "Metadata overlays applied", "authorMappingsReplaced": "Author mappings replaced", "narratorMappingsReplaced": "Narrator mappings replaced", "genreMappingsReplaced": "Genre mappings replaced", "tagMappingsReplaced": "Tag mappings replaced", "coversImported": "Covers imported", "coverImportSkipped": "Cover import was skipped - media root path is not configured on the source", "couldNotMatch": "Could not match", "userDataCard": "User Data", "readingStatuses": "Reading statuses", "readingProgressEntries": "Reading progress entries", "audiobookProgressEntries": "Audiobook progress entries", "bookmarksLabel": "Bookmarks", "annotationsLabel": "Annotations", "collectionEntries": "Collection entries", "loadFullReportHint": "Click \"Load Full Report\" to include the dry-run match summary in the exported report.", "completedNoIssues": "Migration completed with no unresolved books or failures.", "matchedBooksHeading": "Matched books ({count})", "matchedBooksHint": "These dry-run matches were used to decide which library books received imported data.", "sourceBookFallback": "Source book {id}", "libraryBookFallback": "Library book {id}", "unresolvedBooksHeading": "Unresolved books ({count})", "unresolvedBooksHint": "These books exist in the source but could not be matched to any book in your library.", "mappedUsersHeading": "Mapped users ({count})", "mappedUsersHint": "Per-user totals come from the dry-run preview cached with the migration plan.", "coverImportsFailed": "{count} cover import(s) failed. Detailed failure rows are not stored.", "backToSetup": "Back to Setup" }, "libraries": { "title": "Libraries", "subtitle": "Manage your media libraries and trigger content scans.", "scanAll": "Scan all", "scanning": "Scanning...", "addLibrary": "Add library", "scan": "Scan", "editLibrary": "Edit library", "refreshCovers": "Refresh covers", "syncMetadataToFiles": "Sync metadata to files", "deleteLibrary": "Delete library", "bookCount": "{count, plural, =0 {no books} one {# book} other {# books}}", "booksUnit": "{count, plural, one {book} other {books}}", "folderCount": "{count, plural, =0 {no folders} one {# folder} other {# folders}}", "fileMode": "File mode", "folderMode": "Folder mode", "emptyTitle": "No libraries yet", "emptyHint": "Add a library to start organizing your books.", "addFirstLibrary": "Add your first library", "deleteConfirmTitle": "Delete \"{name}\"?", "deleteConfirmBody": "This will permanently remove all books, metadata, reading progress, bookmarks, and annotations in this library. This cannot be undone.", "deleteConfirmTypeName": "Type the library name to confirm:", "deleting": "Deleting...", "deleteLibraryButton": "Delete Library", "syncConfirmTitle": "Sync metadata to files?", "syncFiles": "Sync files", "metadataSynced": "Metadata synced to files for \"{name}\"", "fileWriteNotEnabled": "Metadata file write is not enabled for this library. Enable it in the library settings.", "fileSyncFailed": "File sync failed for \"{name}\"", "scanStarted": "Scan started for \"{name}\"", "scanStartFailed": "Failed to start scan for \"{name}\"", "refreshCoversFailed": "Failed to refresh covers for \"{name}\"", "scanStartedAll": "Scan started for all libraries", "librariesFailedToStart": "{count, plural, =0 {no libraries failed to start} one {# library failed to start} other {# libraries failed to start}}", "scansStartFailed": "Failed to start scans", "libraryCreated": "Library \"{name}\" created", "libraryUpdated": "Library \"{name}\" updated", "libraryDeleted": "\"{name}\" deleted", "deleteFailed": "Failed to delete library", "refreshingCovers": "Refreshing covers {pct}% ({processed}/{total})", "coversRefreshed": "Covers refreshed ({count} processed)", "onDiskUnit": "{size} on disk", "noFilesIndexed": "No files indexed", "formatEntry": "{format} {count}", "formatOverflow": "{count, plural, one {+# more format} other {+# more formats}}", "extraFolders": "{count, plural, one {+# folder} other {+# folders}}", "openLibrary": "Open {name}", "moreActions": "More actions for {name}", "statsFailed": "Could not load library counts. Everything else on this page still works.", "filterLabel": "Filter libraries", "filterPlaceholder": "Filter by name or path", "filterClear": "Clear filter", "sortLabel": "Sort", "noMatchesTitle": "No libraries match that filter", "noMatchesHint": "Nothing matches \"{query}\" by name or folder path.", "totalLibraries": "{count, plural, one {# library} other {# libraries}}", "neverScanned": "Never scanned", "neverScannedHint": "Run a scan to index its folders", "scanFailedAt": "Failed {time}", "scanningPercent": "Scanning {pct}%", "scanCounting": "Counting files", "scanCounts": "{processed} of {total}", "scanAdded": "{count, plural, one {+# added} other {+# added}}", "scanUpdated": "{count, plural, one {# updated} other {# updated}}", "scanMissing": "{count, plural, one {# missing} other {# missing}}", "scanNoChange": "no change", "outcomeSeparator": ", ", "scanOutcome": "{trigger} · {outcome}", "syncConfirmBody": "This will overwrite the metadata inside every supported file in {name} directly on disk. This cannot be undone.", "columns": { "library": "Library", "contents": "Contents", "onDisk": "On disk", "automation": "Automation", "lastScan": "Last scan", "actions": "Actions" }, "sort": { "default": "Default order", "name": "Name", "books": "Books", "size": "Size on disk", "lastScan": "Last scan", "sidebar": "Sidebar order" }, "trigger": { "manual": "Manual", "watcher": "Watcher", "schedule": "Schedule" }, "capability": { "watch": "Watch folders", "schedule": "Scheduled scan", "fileWrite": "Write to file", "fileRename": "Rename files", "on": "{name}: on", "off": "{name}: off", "legendHint": "Dashed means off" }, "stateOn": "On", "stateOff": "Off", "toggleDetail": "Show details for {name}", "durationMs": "{ms} ms", "durationSeconds": "{seconds}s", "durationMinutes": "{minutes}m {seconds}s", "history": { "when": "When", "trigger": "Trigger", "duration": "Duration", "result": "Result", "status": "Status", "statusValue": { "running": "Running", "completed": "Completed", "failed": "Failed" } }, "detail": { "foldersTitle": "Folders & layout", "metadataTitle": "Metadata & reading", "accessTitle": "Access", "historyTitle": "Scan history", "path": "Path {index}", "organization": "Organization", "excludePatterns": "Exclude patterns", "precedence": "Source precedence", "allowedFormats": "Allowed formats", "countsAsStarted": "Counts as started", "countsAsFinished": "Counts as finished", "peopleWithAccess": "People with access", "added": "Added", "coverShape": "Cover shape", "coverShapeValue": { "portrait": "2:3 portrait", "square": "1:1 square" }, "gridShape": "Grid shape", "gridShapeValue": { "tall": "Tall cells", "square": "Square cells" }, "none": "None", "allSupported": "All supported", "patternCount": "{count, plural, one {# pattern} other {# patterns}}", "peopleCount": "{count, plural, =0 {No explicit grants} one {# person} other {# people}}", "historyEmpty": "This library has never been scanned.", "historyFailed": "Could not load the scan history for this library.", "manageAccess": "Manage", "peopleMore": "{count, plural, one {+# more} other {+# more}}" }, "scannedAt": "Scanned {time}", "detailRegion": "Details for {name}", "scanTrigger": { "manual": "Manual", "watcher": "Watcher", "schedule": "Scheduled" }, "schedule": { "at": "{preset} · {time}", "weeklyAt": "{preset} · {day} {time}" }, "librariesUnit": "{count, plural, one {library} other {libraries}}", "foldersUnit": "{count, plural, one {folder} other {folders}}", "copyPath": "Copy path", "pathCopied": "Path copied", "pathCopyFailed": "Could not copy the path", "problem": { "neverTitle": "Never scanned.", "neverBody": "{count, plural, one {Nothing in its folder is indexed yet.} other {Nothing in its # folders is indexed yet.}}", "failedTitle": "The last scan failed {time}.", "scanNow": "Scan now", "retry": "Retry scan" }, "quick": { "watchAria": "Watch folders for {name}", "scheduleAria": "Scheduled scan for {name}: {value}", "customSchedule": "Custom schedule…", "watchOn": "Watching folders for \"{name}\"", "watchOff": "Stopped watching folders for \"{name}\"", "scheduleSet": "Scheduled scan for \"{name}\": {value}", "scheduleOff": "Scheduled scan turned off for \"{name}\"", "saveFailed": "Could not update \"{name}\"", "fileWriteAria": "Write to file for {name}", "renameAria": "Rename files for {name}", "fileWriteOn": "\"{name}\" will write details into its files the next time they are saved", "fileWriteOff": "\"{name}\" will no longer write details into its files", "renameOn": "\"{name}\" will rename files to your naming pattern the next time their details are saved", "renameOff": "\"{name}\" will no longer rename files" }, "historyFor": "Scan history for {name}", "scanNothingNew": "nothing new yet", "scanTimeLeftSeconds": "{count, plural, one {about # second left} other {about # seconds left}}", "scanTimeLeftMinutes": "{count, plural, one {about # minute left} other {about # minutes left}}", "scanFinished": "Scan finished for \"{name}\": {outcome}", "scanFinishedFailed": "Scan failed for \"{name}\"", "viewChanges": "View changes", "duplicateSettings": "Duplicate settings" }, "authorEnrichment": { "configuration": "Configuration", "saving": "Saving...", "running": "Running...", "runEligibleShort": "Run eligible", "runAllShort": "Run all", "enableTitle": "Enable auto author enrichment", "enableHint": "Automatically fetch author biographies and profile photos when books are added or updated.", "triggerOnImportTitle": "Trigger on import", "triggerOnImportHint": "Queue authors for enrichment when books are first added to a library.", "eligibilityTitle": "Eligibility conditions", "eligibilityHint": "An author is eligible if it matches any enabled condition.", "neverEnrichedTitle": "Never enriched", "neverEnrichedHint": "Enrich authors that have never had a successful enrichment.", "missingBioTitle": "Missing bio", "missingBioHint": "Enrich if the author has no biography.", "missingPhotoTitle": "Missing photo", "missingPhotoHint": "Enrich if the author has no profile photo.", "runForEligibleAuthors": "Run for eligible authors", "eligibleCount": "~{count} eligible", "runForAllAuthors": "Run for all authors", "saved": "Author enrichment settings saved", "saveFailed": "Failed to save author enrichment settings", "noEligibleAuthors": "No eligible authors found", "noAuthorsToEnrich": "No authors to enrich", "queueFailed": "Failed to queue author backfill", "fields": { "description": "Biography", "photo": "Photo", "birthDate": "Born", "deathDate": "Died", "website": "Website", "genres": "Genres", "influences": "Influences" }, "metadataPreferences": { "title": "Field sources", "hint": "Set the order each field is filled from. The first provider with a value wins.", "noProviders": "No provider available", "saved": "Field sources saved", "saveFailed": "Could not save field sources", "limitedProviders": "{providers} supplies only biographies and photos.", "addProvider": "Add {provider} as a source" } }, "scoreWeights": { "groupLabel": "Score Weights", "assignHintPrefix": "Assign a weight to each field. Total weight:", "areYouSure": "Are you sure?", "resetToDefaultsButton": "Reset to defaults", "recalculateAll": "Recalculate all", "confirmReset": "Confirm reset", "resetDialog": { "title": "Reset every weight to its default?", "description": "All 24 fields go back to the weights BookOrbit ships with. Nothing is saved until you choose Save and rescore." }, "reset": "Reset", "recalculate": "Recalculate", "subtotal": "subtotal: {count}", "savedRecalculating": "Score weights saved. Recalculating library scores...", "saveFailed": "Failed to save score weights", "recalcStarted": "Score recalculation started in the background", "recalcFailed": "Recalculation failed", "resetToDefaults": "Weights reset to defaults. Save to apply.", "howItWorks": { "title": "How this works.", "summary": "Every book gets a score out of 100 for how complete its metadata is. A weight is only meaningful next to the others, so each field below shows the share of a finished score it is responsible for. Doubling every weight changes nothing." }, "readOnly": "You can see how scores are calculated, but changing weights needs the App settings permission.", "compositionTitle": "Where a score comes from", "compositionHint": "Percentages always add up to 100.", "searchFields": "Filter fields", "clearSearch": "Clear search", "noMatches": "No fields match that search.", "totalSummary": "{scoring} of 24 fields scoring, {total} points total", "countGroups": "Count towards the score", "notScored": "Not scored", "notScoredHeading": "Not scored ({count})", "notScoredHint": "A field at zero leaves the total too, so books missing it are not marked down.", "decreaseWeight": "Decrease the weight of {field}", "increaseWeight": "Increase the weight of {field}", "revertField": "Revert {field} to the saved weight", "table": { "field": "Field", "weight": "Weight", "share": "Share of score", "versusDefault": "Change" }, "groups": { "core": "Core", "publishing": "Publishing", "classification": "Classification", "enrichment": "Enrichment", "providers": "Provider IDs" }, "rules": { "text": "Counts when it is not empty", "positive": "Counts when it is above zero", "count": "Counts when at least one is set", "cover": "Counts when a cover image is stored", "providerId": "Counts when the ID is stored", "seriesIndex": "Counts when above zero, so volume 0 never counts" }, "rail": { "title": "Where your books land", "description": "The badge colour a reader sees on a book card, against every book you can see today.", "bandsLabel": "Badge colour bands", "bands": { "poor": "UNDER 50", "fair": "50-69", "good": "70-89", "great": "90+" }, "median": "Median", "belowFifty": "Under 50", "ninetyPlus": "90 and up", "noBooks": "No scored books yet. Run a rescore once your library has finished importing.", "scopeNote": "Across {count, plural, one {# book} other {# books}} in the libraries you can access, scored with the weights currently saved." }, "progress": { "running": "Rescoring library", "failed": "Rescore failed", "count": "{processed} books processed", "countOf": "{processed} of {total} books", "failedCount": "({count} failed)", "safeToLeave": "Safe to leave this page.", "dismiss": "Dismiss" }, "save": { "upToDate": "All changes saved.", "unsaved": "{count, plural, one {# field changed} other {# fields changed}}", "totalShift": "total {from} to {to} points", "rescores": "Saving rescores {count, plural, one {# book} other {# books}} in the background.", "rescoresUnknown": "Saving rescores your library in the background.", "action": "Save and rescore", "discard": "Discard", "leaveWarning": "You have unsaved weight changes. Leave the page and lose them?" } }, "tabs": { "users": "Users", "account-activity": "Account Activity", "magic-links": "Magic Links", "oidc": "OIDC / SSO", "tts": "Text-to-Speech", "server-fonts": "Server Fonts" }, "tts": { "title": "Providers", "subtitle": "Speech engines available to readers. Voices are curated per provider.", "summary": "{providers, plural, one {# provider} other {# providers}} · {enabled} enabled · {voices, plural, one {# voice curated} other {# voices curated}}", "addProvider": "Add provider", "loadFailed": "Failed to load text-to-speech configuration", "empty": "No speech providers configured.", "reorderHint": "Drag to reorder. Readers see providers in this order.", "dragHandle": "Reorder {name}", "moveUp": "Move {name} up", "moveDown": "Move {name} down", "reorderFailed": "Failed to save the provider order", "expand": "Show details for {name}", "collapse": "Hide details for {name}", "toggleEnabled": "Enable {name}", "enableFailed": "Failed to update {name}", "statusConnected": "Connected", "statusUnreachable": "Unreachable", "statusUnchecked": "Not checked", "voiceCount": "{count, plural, one {# voice} other {# voices}}", "configuration": "Configuration", "fieldType": "Type", "fieldTypeOpenAi": "OpenAI-compatible", "fieldApiKey": "API key", "apiKeySet": "Set", "apiKeyNotSet": "Not set", "fieldModel": "Default model", "fieldModelNone": "Provider default", "fieldDiscovery": "Voice discovery", "discoverySupported": "Supported", "discoveryUnsupported": "Not supported", "voices": "Voices", "voicesCurated": "{count} curated", "voicesTapToPreview": "Tap a voice to preview it", "voicesNone": "No voices configured yet", "manageVoices": "Manage voices", "previewVoice": "Preview {name}", "previewStop": "Stop preview", "previewFailed": "Could not play a preview for {name}", "previewNeedsEnabled": "Enable this provider to preview its voices", "editConfiguration": "Edit configuration", "testConnection": "Test connection", "testPassed": "Connected · {count, plural, one {# voice found} other {# voices found}}", "testFailed": "Connection failed", "delete": "Delete", "deleteConfirm": "Delete the provider \"{name}\"? Readers using its voices fall back to another provider.", "deleteFailed": "Failed to delete {name}", "deleted": "Provider deleted", "saveFailed": "Failed to save {name}", "saved": "Provider saved", "formAddTitle": "New provider", "formEditTitle": "Edit provider", "formName": "Name", "formNamePlaceholder": "Kokoro", "formBaseUrl": "Base URL", "formBaseUrlPlaceholder": "http://localhost:8880/v1", "formApiKey": "API key", "formApiKeyOptional": "Optional", "formApiKeyPlaceholder": "sk-...", "formApiKeyKeep": "Leave blank to keep the current key", "formModel": "Default model", "formModelPlaceholder": "tts-1", "formDiscovery": "This provider can list its own voices", "formRequired": "Name and base URL are required", "curation": { "title": "Manage Voices - {provider}", "summary": "{count, plural, one {# voice configured} other {# voices configured}}", "summaryUnsaved": "{count, plural, one {# voice configured} other {# voices configured}} - Unsaved changes", "importFromProvider": "Import from provider", "loadPreset": "Load {preset} preset", "importUnsupported": "This provider does not support voice discovery.", "importUnsupportedWithPreset": "This provider does not support voice discovery. Use the “Load {preset} preset” button instead.", "discoveryUnsupported": "This provider does not expose a voice list endpoint.", "discoverFailed": "Failed to discover voices", "emptyImportOrPreset": "No voices configured. Import from provider or load a preset.", "emptyImport": "No voices configured. Import from provider.", "emptyPreset": "No voices configured. Load a preset to get started.", "emptyManual": "No voices configured. Add voices manually.", "columnId": "ID", "columnName": "Name", "columnLocale": "Locale", "columnGender": "Gender", "genderMale": "Male", "genderFemale": "Female", "genderUnknown": "Unknown", "cancelEdit": "Cancel edit", "editVoice": "Edit {name}", "deleteVoice": "Delete {name}", "previewVoice": "Preview {name}", "stopPreview": "Stop preview for {name}", "saveVoices": "{count, plural, one {Save # voice} other {Save # voices}}" } }, "serverFonts": { "title": "Server Fonts", "subtitle": "Upload fonts that every user can pick in the eBook reader, without uploading their own.", "listLabel": "Server fonts", "noFontsYet": "No server fonts yet", "noFontsHint": "Fonts you add here appear in every user's reader.", "addFonts": "Add fonts", "filterLabel": "Filter families", "filterPlaceholder": "Filter families", "filterClear": "Clear filter", "noMatches": "No families match “{query}”", "previewLabel": "Preview text", "previewPlaceholder": "Type to preview it in every family", "previewSize": "Preview size", "previewSizeOption": "{size} px", "familiesUnit": "{count, plural, one {family} other {families}}", "filesOfMax": "{count} of {max} files", "onDisk": "{size} on disk", "columns": { "family": "Family", "specimen": "Specimen", "styles": "Styles", "readers": "Readers" }, "fileSummary": "{count, plural, one {# file} other {# files}} · {size}", "newBadge": "New", "styles": { "single": "{style} only", "many": "{count} styles", "manyNoItalics": "{count} styles, no italics" }, "facts": { "books": "{count, plural, one {On # book} other {On # books}}", "booksDetail": "{books, plural, one {Set on # book} other {Set on # books}} by {readers, plural, one {# reader} other {# readers}}", "defaults": "{count, plural, one {Default for # reader} other {Default for # readers}}", "hidden": "{count, plural, one {Hidden by # reader} other {Hidden by # readers}}" }, "moreActions": "More for {name}", "menu": { "rename": "Rename family", "addFiles": "Add files", "remove": "Remove family…" }, "footerHint": "Every reader sees these in the reader's font list and can hide any of them under Reader › Fonts.", "empty": { "dropHint": "or drop files anywhere on this page", "tip": "A family reads best as four files: Regular, Italic, Bold and Bold Italic. One variable file can stand in for every weight." }, "drop": { "title": "{count, plural, one {Drop to add # file for every reader} other {Drop to add # files for every reader}}" }, "upload": { "ariaLabel": "Upload progress", "title": "{count, plural, one {Adding # file} other {Adding # files}}", "progress": "{done} of {total} done", "addedCount": "{count} added", "duplicateCount": "{count} already here", "refusedCount": "{count} not added", "dismiss": "Dismiss", "newFamily": "new family", "states": { "queued": "Waiting", "uploading": "Uploading", "added": "Added", "duplicate": "Already on the server", "refused": "Not added", "failed": "Failed" }, "reasons": { "tooLarge": "Larger than {maxMb} MB.", "unsupportedType": "Not a font file. Use TTF, OTF, WOFF or WOFF2.", "invalidFile": "The file is damaged or is not really a font.", "faceTaken": "{familyName} already has a file at this weight and style.", "limitReached": "The server already holds {limit} font files.", "failed": "Upload failed. Try again." } }, "sheet": { "description": "Preview, rename and manage the files of {name}", "variable": "Variable", "preview": "Preview", "pageColour": "Page colour", "papers": { "app": "App surface", "white": "White page", "sepia": "Sepia page", "night": "Night page" }, "previewHeading": "The Garden of Live Flowers", "previewParagraph1": "Alice looked round her in great surprise. “Why, I do believe we’ve been under this tree the whole time! Everything’s just as it was!”", "previewParagraph2": "“Now, here, you see, it takes all the running you can do, to keep in the same place. If you want to get somewhere else, you must run at least twice as fast as that!”", "styles": "Styles", "stylesHint": "What the reader's Style row offers", "singleStyleNote": "One style, so readers get no Style row. Bold and italic text in books is faked by the browser from {style}.", "inReader": "In the reader", "inReaderHint": "The font list every reader gets in Reader › Settings, with {name} chosen.", "pickerLabel": "Preview of the reader's font list", "files": "Files", "filesUsed": "{count} of {max} used on this server", "fileDetail": "{summary} · Added {date}", "upright": "Upright", "italic": "Italic", "fileActions": "More for {name}", "changeStyle": "Change weight and style", "removeFile": "Remove file", "removeFileQuestion": "Remove this file for every reader?", "weight": "Weight", "style": "Style", "name": "Family name", "nameHint": "Readers pick fonts by this name.", "nameHiddenWarning": "{count, plural, one {# reader hid {name}} other {# readers hid {name}}}; a new name shows it to them again.", "nameBooksWarning": "A new name sends {count, plural, one {the # book that uses it} other {the # books that use it}} back to the book’s own font.", "readers": "Readers", "stats": { "books": "{count, plural, one {book uses it} other {books use it}}", "defaults": "{count, plural, one {reader's default} other {readers' default}}", "hidden": "{count, plural, one {reader hid it} other {readers hid it}}" }, "readersPrivacy": "Counts only. Which books and which readers stay private to them.", "removeLabel": "Remove family", "removeQuestion": "Remove {name} for every reader?", "removeConsequenceBooks": "{books, plural, one {It is set on # book} other {It is set on # books}} by {readers, plural, one {# reader} other {# readers}}; those books go back to the book's own font.", "removeConsequenceFiles": "{count, plural, one {Its file is deleted from the server.} other {All # files are deleted from the server.}}", "loadFailedNote": "This browser could not load the font file, so the previews show a fallback face. Readers' browsers will most likely refuse it too; try a different copy of the font." }, "toasts": { "removed": "{name} removed", "removePartial": "{failed, plural, one {# file} other {# files}} of {name} could not be removed", "renameTaken": "{name} already has a file at the same weight and style" }, "loadFailed": "This browser can't load it" } }, "common": { "nav": { "libraries": "Libraries", "display": "Display", "reader": "Reader", "metadata": "Metadata", "usersAccess": "Users & Access", "email": "Email", "opds": "OPDS", "kobo": "Kobo", "koreader": "KOReader", "tts": "Text-to-Speech", "integrations": "Integrations", "hardcover": "Hardcover", "admin": "Admin", "system": "System", "account": "Account" } }, "integrations": { "title": "Integrations", "subtitle": "Connect external services to sync your reading data and highlights.", "noPermission": "You do not have permission to use any integrations.", "tabs": { "hardcover": "Hardcover", "readwise": "Readwise", "storygraph": "StoryGraph" }, "providerSubtitles": { "readwise": "Send your highlights to Readwise automatically.", "storygraph": "Sync your reading progress and status to The StoryGraph." } }, "metadata": { "title": "Metadata", "subtitle": "Configure metadata providers, matching rules, automation, and author enrichment.", "noPermission": "You do not have permission to manage metadata settings.", "fields": { "title": "Title", "subtitle": "Subtitle", "description": "Description", "cover": "Cover", "audioCover": "Audiobook cover", "authors": "Authors", "publisher": "Publisher", "publishedYear": "Published year", "language": "Language", "pageCount": "Page count", "isbn": "ISBNs", "communityRating": "Community rating", "seriesName": "Series name", "seriesIndex": "Series index", "genres": "Genres", "narrators": "Narrators", "duration": "Duration", "abridged": "Abridged", "tags": "Tags", "isbn13": "ISBN-13", "isbn10": "ISBN-10", "googleBooksId": "Google Books ID", "goodreadsId": "Goodreads ID", "amazonId": "Amazon ID", "hardcoverId": "Hardcover ID", "openLibraryId": "Open Library ID", "itunesId": "iTunes ID", "koboId": "Kobo ID", "aladinId": "Aladin ID" }, "mergeStrategy": { "fillMissing": { "label": "Fill missing", "description": "Only write if field is currently empty", "short": "Fill gaps" }, "mergeExisting": { "label": "Merge with existing", "description": "Keep stored genres and append new provider genres", "short": "Merge" }, "overwriteIfProvided": { "label": "Overwrite if provided", "description": "Write if provider returned a value", "short": "If provided" }, "overwrite": { "label": "Always overwrite", "description": "Always replace existing value", "short": "Always" } }, "autoFetch": { "globalSettings": "Global Settings", "perLibraryOverrides": "Per-Library Overrides", "saving": "Saving...", "running": "Running...", "runNow": "Run now", "runForEligible": "Run for eligible books", "enable": { "label": "Enable auto-fetch", "hint": "Automatically fetch metadata for eligible books." }, "triggerOnImport": { "label": "Trigger on import", "hint": "Queue eligible books when they are first added to a library." }, "status": { "inQueuePaused": "{count} in queue - paused", "remaining": "{count} remaining", "eligible": "~{count} eligible" }, "trigger": { "queued": "{count, plural, one {Queued # book} other {Queued # books}}", "noneFound": "No eligible books found" }, "lastRun": { "justNow": "just now", "minutesAgo": "{count}m ago", "hoursAgo": "{count}h ago", "yesterday": "yesterday", "daysAgo": "{count, plural, one {# day ago} other {# days ago}}", "label": "Last run: {when}", "labelQueued": "Last run: {when} - queued {count} books", "labelNoneEligible": "Last run: {when} - no eligible books" }, "conditions": { "title": "Eligibility conditions", "hint": "A book is eligible if it matches any enabled condition.", "noneEnabled": "No conditions enabled", "neverFetched": { "label": "Never fetched", "hint": "Fetch books that have never had a metadata fetch attempt.", "summary": "Never fetched" }, "scoreThreshold": { "label": "Low metadata score", "hint": "Fetch if the metadata score is below a threshold.", "scoreBelow": "Score below", "summary": "Score < {threshold}" }, "missingFields": { "label": "Missing fields", "hint": "Fetch if any of the selected fields are empty.", "summary": "{count, plural, one {Missing # field} other {Missing # fields}}" } }, "library": { "inheritingGlobal": "Inheriting global defaults", "inheritFromGlobal": "Inherit from global", "usingGlobalDefaults": "Using global defaults.", "saveOverride": "Save override" }, "scope": { "ownSettings": "{count, plural, one {# own setting} other {# own settings}}", "globalIntro": "Every library follows this rule unless it has its own.", "globalCoverage": "{libraryCount, plural, one {Applies to # library} other {Applies to # libraries}}, {bookCount, plural, one {# book} other {# books}}.", "ownLibraries": "{names} {count, plural, one {has its own rule.} other {have their own rules.}}", "libraryFollows": "{library} follows the global rule. Change anything here to give it its own.", "libraryOwn": "{library} has its own rule for {count, plural, one {# setting} other {# settings}}. Everything else follows the global rule.", "lastRun": "Last run {when}, queued {count, plural, one {# book} other {# books}}.", "neverRun": "Not run yet.", "useGlobalRule": "Use the global rule", "loadFailed": "Auto-fetch settings could not be loaded. Reload the page to try again.", "saved": "Saved {scope}", "saveFailed": "Could not save {scope}. Try again." }, "run": { "all": "Run for every library", "library": "Run for {library}", "saveFirst": "Runs use the saved rule. Save first.", "failed": "The run could not be started. Try again." }, "onImport": { "label": "Fetch metadata for new books", "hint": "Scans and uploads queue matching books right away. A fetch on import only fills empty fields; locked fields are never changed.", "follow": "Follow global", "on": "On", "off": "Off" }, "columns": { "books": "{count, plural, one {book} other {books}}", "ofTotal": "of {total}", "off": "Off", "own": "Own", "global": "Global", "useGlobal": "Use global", "globalValue": "Global rule: {value}", "on": "On", "scoreBelowValue": "Score below {threshold}", "neverFetchedSplit": "{count, plural, one {# never fetched} other {# never fetched}}", "fetchedBeforeSplit": "{count, plural, one {# fetched before} other {# fetched before}}", "lowScoreLabel": "Low confidence score", "lowScoreHint": "Fetch books whose confidence score is under the line.", "outOf": "/ 100", "lowerThreshold": "Lower the threshold", "raiseThreshold": "Raise the threshold", "missingHint": "Fetch if any selected field is empty. Each field shows how many books lack it.", "audioGroup": "Books with audio", "audioHint": "{count, plural, =0 {None here have audio.} one {Only the # book with audio can lack these.} other {Only the # with audio can lack these.}}", "fieldCount": "{field}: {count, plural, one {# book lacks it} other {# books lack it}}" }, "histogram": { "label": "Confidence score threshold", "valueText": "Score below {threshold}" }, "preview": { "title": "What a run would fetch", "matching": "{matching, plural, one {# of {total} books matches} other {# of {total} books match}}", "showing": "{count, plural, one {showing the least complete} other {showing the # least complete}}", "empty": "No book matches this rule, so a run would queue nothing.", "unknownAuthor": "Unknown author", "score": "Score {score}", "more": "+{count}", "missing": { "title": "No title", "subtitle": "No subtitle", "description": "No description", "cover": "No cover", "audioCover": "No audiobook cover", "authors": "No authors", "publisher": "No publisher", "isbn": "No ISBN", "publishedYear": "No published year", "language": "No language", "pageCount": "No page count", "communityRating": "No community rating", "seriesName": "No series name", "seriesIndex": "No series index", "genres": "No genres", "narrators": "No narrators", "duration": "No duration", "abridged": "Abridged not set" } }, "queue": { "progress": "{done} of {total}", "failed": "{count, plural, one {# book could not be fetched} other {# books could not be fetched}}" } }, "providers": { "tabs": { "builtIn": "Built-in", "external": "External", "attention": "Needs attention" }, "availableSources": "Available Sources", "saveChanges": "Save Changes", "discard": "Discard", "configure": "Configure", "test": "Test", "testing": "Testing...", "testHint": "Checks these credentials against the live service. Nothing is saved.", "enabled": "Enabled", "retryIn": "Retry in {duration}", "runTestBeforeEnabling": "Run Test before enabling", "hardcoverEnableHint": "Run Test with the current token to unlock the enable switch.", "searchPlaceholder": "Filter sources", "sourcesEnabled": "{enabled} of {total} sources enabled", "groupEnabled": "{enabled} of {total} on", "unsavedChanges": "{count, plural, one {# unsaved change} other {# unsaved changes}}", "noMatches": "No sources match this filter.", "clearFilters": "Clear filters", "filter": { "label": "Filter sources by state", "all": "All", "enabled": "Enabled", "needsSetup": "Needs setup" }, "groups": { "books": "General book catalogues", "audiobooks": "Audiobooks", "comics": "Comics & light novels", "regional": "Regional catalogues" }, "badge": { "setupRequired": "Setup Required", "throttled": "Throttled", "ready": "Ready", "active": "Active" }, "fields": { "apiKey": "API Key", "region": "Region", "cookie": "Cookie", "coverResolution": "Cover Resolution", "country": "Country", "language": "Language", "ttbKey": "TTB Key" }, "helpers": { "googleApiKey": "Google Books API key from Google Cloud." }, "hints": { "google": "Broad coverage from Google's book index. Google Books now requires an API key before this provider can be enabled.", "amazon": "Session cookie is recommended. Paste cookie value only (no \"Cookie:\").", "goodreads": "The largest reading community on the web. No setup required.", "hardcover": "A modern alternative to Goodreads. Token from hardcover.app/account/api. \"Bearer \" prefix is optional.", "openLibrary": "The Internet Archive's free book catalog. No setup required.", "itunes": "Apple's digital book catalog. Choose whether to fetch high or standard resolution covers.", "kobo": "Scrapes Kobo's public book pages. Country and language must match Kobo URL paths; bot protection can block requests.", "audible": "Pulls audiobook metadata from Audible. No additional setup is required.", "audnexus": "Community-driven audiobook metadata. No setup required.", "librofm": "DRM-free audiobook catalog metadata. Uses an undocumented Libro.fm endpoint and is disabled by default.", "comicvine": "Comic book metadata from ComicVine. A free API key is required from comicvine.gamespot.com.", "ranobedb": "Japanese light novel metadata from RanobeDB. No setup required.", "lubimyczytac": "Polish book catalog (lubimyczytac.pl). Scrapes public book pages. No setup required.", "aladin": "Korean book metadata from Aladin (알라딘). A TTB Key from aladin.co.kr is required." }, "blocked": { "google": "Google Books requires an API key before it can be enabled", "hardcover": "Hardcover requires an API key before it can be enabled", "hardcoverTest": "Hardcover token must pass Test before it can be enabled", "comicvine": "ComicVine requires an API key before it can be enabled", "aladin": "Aladin requires a TTB Key before it can be enabled" } }, "providerDirectory": { "title": "Available to install", "hint": "Each one runs as a small container beside BookOrbit. Copy its Compose service into the file that runs BookOrbit, start it with docker compose up -d, then choose Add.", "updated": "Updated {time}", "bundled": "List included with this version", "loadFailed": "The list of ready-made providers could not be loaded. You can still add any provider by its address.", "copy": "Copy Compose", "copyLabel": "Copy the Compose service for {name}", "copied": "{name} copied. Paste it under services: in your Compose file, then run docker compose up -d.", "copyFailed": "Could not copy to the clipboard. The provider's docs have the same snippet.", "add": "Add", "addLabel": "Add {name}", "alreadyAdded": "Already added: {names}", "allAdded": "You have added every provider in this list.", "wasBuiltIn": "Was built in", "docs": "Docs", "docsLabel": "{name} documentation, opens in a new tab", "media": { "book": "Books", "audiobook": "Audiobooks", "comic": "Comics" } }, "buildYourOwn": { "title": "Build your own", "body": "Missing a source? A provider is a small web service that answers three JSON requests, so any language will do. Start from the Rust or Go starter, check it with the conformance checker, then add it here like any other.", "links": { "guide": "Building guide", "starters": "Starters", "checker": "Conformance checker", "suggest": "Suggest a source" } }, "movedProviders": { "title": "Some sources are no longer built in", "description": "Field rules that list these sources skip them for now. The ids and links already on your books are kept.", "run": "{name} now runs as its own provider: run {image}, then add it under External providers.", "closed": "{name} closed the service BookOrbit used, so it cannot be added back. Remove it from your field rules." }, "externalProviders": { "title": "External providers", "description": "Metadata services that run outside BookOrbit, such as a container beside it or a hosted service. Add one by its address; once enabled it appears in search, Book Dock and field rules like any other source.", "yourProviders": "Your providers", "emptyWithDirectory": "Nothing added yet. Pick a ready-made provider below, or add one by its address.", "add": "Add provider", "empty": "No external providers yet. Any service that speaks the book-metadata-provider spec can be added here.", "edit": "Edit {name}", "toggle": "Enable {name}", "row": "{host} · version {version}", "useInFieldRules": "Use in field rules", "fieldRulesAdded": "{name} added to {count, plural, =0 {no new field rules; it is already in every rule it can fill} one {# field rule} other {# field rules}}.", "added": "{name} added. It stays off until you enable it.", "saved": "{name} saved.", "removed": "{name} removed. Its stored ids and ratings were kept.", "purged": "{name} removed with its stored ids and ratings.", "status": { "active": "Active", "ready": "Ready", "stale": "Last check failed", "unreachable": "Unreachable", "key_changed": "Key changed", "incompatible": "Incompatible", "authorizationUnreadable": "Header unreadable" }, "authorizationUnreadableHint": "The saved authorization header could not be decrypted, so this provider is not searched. Enter the header again.", "sheet": { "createTitle": "Add external provider", "description": "An HTTP service that speaks the book-metadata-provider spec. BookOrbit asks it for metadata; it never runs the provider's code.", "identity": "Key {key} · version {version}", "test": "Test", "testing": "Testing...", "remove": "Remove provider", "removeConfirm": "Remove {name}?", "removeConsequence": "Its stored ids, ratings and field-rule entries stay, so adding it again restores them.", "purge": "Remove and delete its data", "purgeConfirm": "Remove {name} and delete its data?", "purgeConsequence": "Deletes every id and rating stored from it. This cannot be undone." }, "fields": { "baseUrl": "Address", "baseUrlHint": "The provider's base URL, such as http://provider:8080 for a container on the same Docker network.", "authorization": "Authorization header", "authorizationHint": "Optional. Sent exactly as entered, such as \"Bearer abc123\". Stored encrypted and never shown again.", "authorizationSaved": "A header is saved. Enter a new one to replace it.", "clearAuthorization": "Remove the saved header", "allowPrivate": "Allow private address", "allowPrivateHint": "Needed for a provider on your own network or in a container beside BookOrbit. Leave it off for a provider on the internet.", "timeout": "Timeout (seconds)", "timeoutHint": "Between {min} and {max} seconds.", "privacy": "The provider receives the titles, authors and ISBNs of the books it is asked about." }, "test": { "ok": "{name} answered in {latency} ms with {count, plural, one {# result} other {# results}}.", "sample": "First result: {title}", "failed": "Test failed: {error}" }, "errors": { "privateAddress": "That address is on a private network. Turn on Allow private address to reach a provider there.", "unreachable": "BookOrbit could not reach a provider at that address.", "unauthorized": "The provider refused the authorization header.", "invalidInfo": "That address answered, but not with usable provider info.", "invalidUrl": "Enter the provider address as a full http or https URL, without credentials in it.", "keyTaken": "A provider with the same key is already registered.", "keyChanged": "That address serves a different provider. Add it as a new provider instead.", "notReady": "Run a successful test before enabling this provider.", "authorizationUnreadable": "The saved authorization header could not be decrypted. Enter it again before enabling this provider.", "generic": "The request to the provider failed." } }, "fieldRules": { "clearAllProviders": "Clear All Providers", "clearAll": "Clear All", "resetToDefault": "Reset to Default", "bookCover": "Book cover", "reset": "Reset", "dragProvidersHint": "Drag providers from here onto any field to add them", "dragProviderHere": "drag a provider here", "howItWorks": { "title": "How Field Rules Work", "priorityOrder": { "title": "Priority Order", "body": "Drag providers in the list to reorder them. The top-most provider that returns a result will be the primary source for that field." }, "mergeStrategy": { "title": "Merge Strategy", "fillMissingTerm": "Fill missing:", "fillMissingBody": "Only write if current value is empty.", "overwriteTerm": "Overwrite:", "overwriteBody": "Replace whenever a provider has data." }, "summary": "Providers are tried top to bottom and the first one that returns a value wins. The merge strategy decides whether that value may replace what the book already has; genres can also append new unique values. Set defaults here, then override individual fields per library.", "summaryByMedium": "Providers are tried top to bottom, and the first one with a value wins; genres in merge mode and community ratings combine every provider instead. The merge strategy decides whether a value may replace what the book already has. Audible, AudNexus and Libro.fm only answer for books with audio, read-aloud EPUBs included, so putting them first prefers audiobook metadata without touching ebook-only books. Cover art of the wrong shape fills a slot only when nothing else can. A library override replaces that field's whole rule." }, "libraryOverrides": { "title": "Library Overrides", "hint": "Expand a library to customize individual fields. Fields not overridden inherit global defaults." }, "global": { "title": "Global Defaults", "hint": "Default rules applied to every library. Override per-library below.", "saveDefaults": "Save Defaults", "clearAllConfirm": "Remove all active providers from every field? This will be saved immediately and cannot be undone.", "resetConfirm": "Reset all global field rules to system defaults? This will overwrite your current configuration." }, "advanced": { "title": "Advanced Fetch Behavior", "combineGenres": { "label": "Combine genres from all selected providers", "hint": "Collect and deduplicate genres from every provider assigned to the Genres field, rather than stopping at the first result." }, "maxGenres": { "label": "Maximum genres per book", "hint": "Applied after exclusions and duplicate removal. Leave empty for unlimited. This affects future metadata fetches.", "unlimited": "Unlimited", "error": "Enter a whole number from 1 to {max}, or leave the field empty." }, "storeProviderIds": { "label": "Store provider IDs on books", "hint": "When fetching metadata, save the returned provider IDs (ISBN, ASIN, Goodreads ID, etc.) on the book record for more accurate future lookups." }, "existingProviderIdsOnly": { "label": "Use existing provider IDs only", "hint": "For books already in the library, query only providers with a stored ID and never fall back to a search when an ID lookup fails. Manual search and new-book discovery are unaffected." } }, "library": { "primary": "Primary:", "overrideCount": "{count, plural, one {# Override} other {# Overrides}}", "unsavedSuffix": "(unsaved)", "unsavedChanges": "Unsaved changes", "globalDefaults": "Global Defaults", "overriding": "Overriding: {fields}", "inheritingAll": "Inheriting all global metadata rules", "subHint": "Fields not overridden inherit global defaults.", "resetTooltip": "Remove all overrides and inherit global defaults", "clearAllConfirm": "Remove all active providers from every field in \"{library}\"?", "resetConfirm": "Reset \"{library}\" to global defaults? All library overrides will be removed." }, "groups": { "core": "Core", "contributors": "Contributors", "publication": "Publication", "series": "Series", "classification": "Classification", "audiobook": "Audiobook" }, "groupSummary": { "base": "{fields} fields · {enabled} enabled", "withOverrides": "{base} · {overrides} overrides", "enabledOf": "{enabled} of {fields} enabled" }, "table": { "field": "Field", "activeProviders": "Active Providers (ordered by priority)", "mergeStrategy": "Merge Strategy", "status": "Status", "noMatches": "No fields match these filters." }, "field": { "noProviders": "Enabled but has no providers", "noUsableProvider": "Enabled, but no provider here can fill it", "empty": "Empty", "config": "Config", "custom": "Custom", "default": "Default", "resetToDefault": "Reset to default", "toggle": "Fetch {field} during metadata refresh", "configure": "Configure {field}", "add": "Add", "addHint": "Added at the end of the order. Drag a chip to move it earlier.", "addProviderTo": "Add a provider to {field}", "removeProvider": "Remove {provider}", "noProvidersYet": "No providers yet", "skippedCount": "{count, plural, one {# skipped} other {# skipped}}", "unsaved": "Unsaved", "override": "Override", "inherited": "Inherited", "morePreview": "+{count} more" }, "reservoir": { "disabled": "{provider} - disabled", "notConfigured": "{provider} - not configured", "dragToAssign": "Drag to assign {provider} to a field" }, "sheet": { "subtitle": "Tap providers to assign, use arrows to reorder", "enableField": "Enable this field during refresh", "providers": "Providers", "statusDisabled": "disabled", "statusNotConfigured": "not configured", "done": "Done" }, "scope": { "label": "Rule scope", "global": "Global defaults", "overrideCount": "{count, plural, one {# overridden field} other {# overridden fields}}", "unsavedMarker": "Has unsaved changes" }, "toolbar": { "searchFields": "Search fields", "clearSearch": "Clear search", "provider": "Provider", "anyProvider": "Any", "providerMenuTitle": "Filter and bulk edit by provider", "usedIn": "{count, plural, =0 {unused} one {# field} other {# fields}}", "showOnlyThese": "Show only fields using it", "bulkLabel": "Apply to all {count} fields that use it", "makeFirst": "Make first everywhere", "makeLast": "Make last everywhere", "removeEverywhere": "Remove from all fields", "audioCoverOrderKept": "Reordering skips the Audiobook cover rule, which keeps audiobook sources first.", "allFields": "All fields", "overridesOnly": "Overrides only", "clearFilters": "Clear filters" }, "providerState": { "disabled": "Disabled", "notConfigured": "Not configured", "disabledDetail": "{provider} is turned off, so it stays in the order but is skipped.", "notConfiguredDetail": "{provider} has no credentials yet, so it stays in the order but is skipped.", "neverSupplies": "Never supplies this", "neverSuppliesDetail": "{provider} never supplies this field, so it is skipped here.", "otherShape": "Other cover shape", "otherShapeDetail": "{provider} only has covers of the other shape, so it fills this slot only when nothing else can." }, "detail": { "priority": "Provider priority", "priorityHint": "The first provider that returns a value wins.", "moveUp": "Move {provider} earlier", "moveDown": "Move {provider} later", "result": "Result", "resultHint": "On the next refresh this field resolves in this order:", "noUsableProviders": "No usable provider - this field will not be filled.", "skippedSummary": "{count, plural, one {{providers} is in the order but will be skipped.} other {{providers} are in the order but will be skipped.}}", "appliesTo": "Applies to {scope}.", "inheritGlobal": "Inherit global rule", "inheritingGlobal": "Inheriting the global rule.", "collapse": "Collapse" }, "save": { "upToDate": "No unsaved changes", "unsaved": "{count, plural, one {# unsaved change} other {# unsaved changes}} in {scope}", "discard": "Discard", "action": "Save {scope}" }, "confirm": { "clearProviders": { "title": "Remove every provider?", "description": "This empties the provider list on all 16 fields in {scope}. Nothing is saved until you choose Save." }, "resetScope": { "title": "Reset to defaults?", "globalDescription": "This replaces your global field rules with the system defaults and saves immediately.", "libraryDescription": "This removes every override on {scope} so it inherits the global rules again, and saves immediately." }, "removeProvider": { "title": "Remove {provider} from every field?", "description": "This takes {provider} out of the provider order on every field in {scope}. Nothing is saved until you choose Save." } } }, "genreBlocklist": { "heading": "Global Genre Exclusions", "hint": "Exact genre values in this list are stripped from provider results before metadata is written.", "saving": "Saving", "genreValueLabel": "Genre value", "addPlaceholder": "Add a genre value, for example Audiobook", "duplicate": "This genre is already blocked.", "add": "Add", "filterPlaceholder": "Filter blocklist", "entryCount": "{count, plural, one {# entry} other {# entries}}", "filteredCount": "{shown} of {total}", "noFilterMatch": "No blocked genres match the current filter.", "emptyTitle": "No blocked genres", "emptyHint": "Add exact values such as Audiobook or Adult to keep them out of fetched metadata.", "removeLabel": "Remove {genre}" }, "searchCache": { "loadFailed": "Could not load the search cache settings.", "retry": "Try again", "saved": "Search cache settings saved", "saveFailed": "Failed to save search cache settings", "units": { "hours": "Hours", "days": "Days" }, "general": { "title": "Saved answers", "enabled": "Save provider answers", "enabledHint": "Searches, bulk refreshes and background fetches reuse saved answers instead of asking each provider again.", "resultsTtl": "Keep results for", "resultsTtlHint": "How long an answer with results is reused before the provider is asked again.", "resultsTtlUnit": "Results time unit", "emptyTtl": "Keep empty answers for", "emptyTtlHint": "How long a provider finding nothing is remembered. Only applies to providers marked as caching empty answers. 0 never keeps empty answers.", "emptyTtlUnit": "Empty answers time unit", "staleGrace": "Use expired answers for", "staleGraceHint": "When a provider fails, an answer up to this long past its expiry is used instead. 0 never falls back.", "staleGraceUnit": "Expired answers time unit", "storage": "Storage budget", "storageHint": "The oldest answers are removed once saved answers pass this size. On disk the table can take roughly 1.5 to 2 times the budget.", "storageUnit": "MB" }, "providers": { "title": "Per-provider settings", "hint": "Leave a box blank to use the value above. Turn a provider off to always ask it live.", "books": "Books", "authors": "Authors", "none": "No providers are available.", "globalOff": "Saving answers is turned off, so these settings apply once it is turned back on.", "on": "On", "off": "Off", "enabledLabel": "Save answers from {provider}", "resultsTtl": "Keep results for", "resultsTtlLabel": "Keep {provider} results for", "resultsTtlUnitLabel": "Time unit for {provider} results", "emptyTtl": "Keep empty answers for", "emptyTtlLabel": "Keep empty {provider} answers for", "emptyTtlUnitLabel": "Time unit for empty {provider} answers", "noEmptyCaching": "Empty answers from this provider are never saved.", "notCacheable": "Answers from this provider are never saved.", "reset": "Reset {provider} to the defaults" }, "validation": { "required": "Enter a value.", "wholeNumber": "Enter a whole number.", "range": "Enter a value from {min} to {max}.", "tooManyOverrides": "Too many providers have their own settings. Reset some of them to save." }, "save": { "unsaved": "Unsaved changes", "invalid": "Fix the highlighted fields to save", "upToDate": "All changes saved", "discard": "Discard", "action": "Save" }, "stats": { "group": "Usage", "title": "Saved answers", "refresh": "Refresh", "loadFailed": "Could not load cache usage.", "storage": "Storage used", "storageUsed": "{used} of {budget}", "storageHint": "Size of the saved answers themselves. The table on disk is larger.", "entries": "Saved answers", "emptyEntries": "Empty answers", "diskSize": "Table size on disk", "hitRate": "Hit rate", "requestsAvoided": "Requests avoided", "fallbacks": "Fallbacks", "skippedWrites": "Skipped writes", "oldest": "Oldest answer", "none": "None yet", "countersHint": "Hit rate, requests avoided, fallbacks and skipped writes count since the server last started.", "perProvider": "Saved answers by provider", "provider": "Provider", "kind": "Type", "size": "Size", "empty": "Nothing is saved yet." }, "clear": { "group": "Maintenance", "title": "Clear saved answers", "regionHint": "Providers can answer differently by location. Clear the cache after moving the server to another region or VPN.", "action": "Clear", "failed": "Failed to clear saved answers", "done": "{count, plural, one {Removed # saved answer} other {Removed # saved answers}}", "donePending": "{count, plural, one {Removed # saved answer. The rest are being removed in the background.} other {Removed # saved answers. The rest are being removed in the background.}}", "empty": { "label": "Clear empty answers only", "hint": "Forgets that providers found nothing, so those searches ask again.", "confirmTitle": "Clear empty answers?", "confirmDescription": "Saved answers where a provider found nothing are removed. Answers with results are kept." }, "book": { "label": "Clear book answers", "hint": "Removes everything saved from book providers.", "confirmTitle": "Clear book answers?", "confirmDescription": "Every saved answer from book providers is removed. The next searches ask those providers again." }, "author": { "label": "Clear author answers", "hint": "Removes everything saved from author providers.", "confirmTitle": "Clear author answers?", "confirmDescription": "Every saved answer from author providers is removed. The next searches ask those providers again." }, "all": { "label": "Clear all saved answers", "hint": "Empties the cache. Every provider is asked again on the next search.", "confirmTitle": "Clear all saved answers?", "confirmDescription": "The whole cache is emptied. Searches will be slower until it fills again, and nothing is left to fall back on while a provider is down." } } }, "customFields": { "label": "Label", "labelPlaceholder": "e.g. Original Title", "labelTooLong": "Label must be 255 characters or fewer", "labelDuplicate": "A field with this label already exists", "type": "Type", "usage": "{count, plural, one {Used by # book} other {Used by # books}}", "newField": { "title": "New Field", "hint": "Define a custom metadata field and choose which libraries use it." }, "previewToggle": "Preview how this field appears when editing a book", "untitledField": "Untitled field", "addField": "Add field", "fields": "Fields", "fieldsHint": "Drag to reorder, edit labels, toggle libraries, or archive fields you no longer need.", "searchPlaceholder": "Search fields", "searchAriaLabel": "Search custom fields", "emptyTitle": "No custom fields yet", "emptyHint": "Use the form above to define your first custom metadata field.", "noMatchTitle": "No fields match \"{query}\"", "noMatchHint": "Try a different label, key, or type.", "clearSearchToReorder": "Clear search to reorder", "dragToReorder": "Drag to reorder", "dragToReorderField": "Drag to reorder field", "unsaved": "Unsaved", "archive": "Archive", "archivedFields": "Archived Fields", "archivedSummary": "{count, plural, one {# archived field - restore or permanently delete.} other {# archived fields - restore or permanently delete.}}", "archivedAt": "Archived {when}", "restore": "Restore", "deleteForever": "Delete forever", "deleteDialog": { "title": "Permanently delete field", "bodyBefore": "This will permanently delete", "bodyMiddle": "and remove its stored values from", "bodyAfter": ". This cannot be undone.", "confirmBefore": "Type", "confirmAfter": "to confirm", "confirmPlaceholder": "Type the field label to confirm" }, "preview": "Preview", "sampleValue": "Sample value", "enabledLibraries": "Enabled Libraries", "countOf": "{selected} of {total}", "selectAll": "Select all", "clear": "Clear", "noLibraries": "No libraries available yet.", "allLibraries": "All libraries", "pageFacts": "{fields, plural, one {# field} other {# fields}} · {values, plural, one {# value stored} other {# values stored}}", "newFieldAction": "New field", "views": { "label": "Show active or archived fields", "active": "Active", "archived": "Archived" }, "columns": { "order": "Order", "field": "Field", "type": "Type", "libraries": "Libraries", "filled": "Filled", "valuesKept": "Values kept", "archived": "Archived", "actions": "Actions" }, "orderHint": "Drag to set the order fields appear in on Edit Metadata, in table columns and in exports.", "archivedHint": "Archived fields are hidden from books, filters and exports. Their values stay stored until the field is deleted.", "coverage": "{filled} of {total}", "coverageAria": "{filled} of {total} books have a value", "onNoLibrary": "No libraries", "onNoLibraryHint": "On no library, so this field appears nowhere", "moreLibraries": "+{count}", "noValues": "None", "rowActions": { "edit": "Edit", "editField": "Edit field", "moveUp": "Move up", "moveDown": "Move down", "archive": "Archive", "restore": "Restore", "deletePermanently": "Delete permanently…", "more": "More actions for {label}" }, "toasts": { "loadFailed": "Couldn't load custom fields", "created": "{label} created", "createFailed": "Couldn't create {label}", "saved": "{label} saved", "saveFailed": "Couldn't save {label}", "archived": "{label} archived", "archiveFailed": "Couldn't archive {label}", "restored": "{label} restored", "restoreFailed": "Couldn't restore {label}", "deleted": "{label} deleted", "deleteFailed": "Couldn't delete {label}", "reorderFailed": "Couldn't save the new order" }, "empty": { "body": "Track what BookOrbit has no field for, like where a book sits on your shelf or who has borrowed it. Fields appear on Edit Metadata, in table columns and in filters.", "examples": "Start from an example", "shelfNumber": "Shelf Number", "acquiredOn": "Acquired On", "signedCopy": "Signed Copy", "loanedTo": "Loaned To" }, "types": { "text": { "label": "Text", "hint": "Any words", "example": "First printing, signed bookplate" }, "url": { "label": "Link", "hint": "Opens in a new tab", "example": "https://example.com/book" }, "number": { "label": "Number", "hint": "Sorts by value", "example": "42" }, "date": { "label": "Date", "hint": "A calendar day", "example": "2024-03-09" }, "boolean": { "label": "Yes / No", "hint": "A checkbox", "example": "Yes" } }, "sheet": { "newTitle": "New field", "editDescription": "Edit a custom field's label and libraries, and see where it appears.", "newDescription": "Name a new custom field, pick its type and choose its libraries.", "archivedDescription": "An archived custom field. Restore it, or delete it with its values.", "statusFilled": "{filled} of {total, plural, one {# book} other {# books}} filled", "statusNone": "Not on any library", "statusHidden": "{count} hidden", "statusCreated": "created {date}", "labelHint": "Shown on Edit Metadata, in table columns and in filters.", "renameHint": "Renaming keeps every stored value and the file key {key}.", "keyHint": "Saved in files and exports as {key}, which stays the same if you rename the field.", "typeLocked": "Set when created", "typeLockedHint": "The type cannot change later, so stored values always match it.", "libraries": "Libraries", "books": "{count, plural, one {# book} other {# books}}", "filledOfBooks": "{filled} of {total, plural, one {# book} other {# books}}", "hiddenCount": "{count} hidden", "leavingNote": "{count, plural, one {# value in {libraries} stays stored but hidden while the field is off there.} other {# values in {libraries} stay stored but hidden while the field is off there.}} Turning it back on brings them back.", "noLibraryWarning": "With no libraries this field appears nowhere: not on Edit Metadata, in filters or in exports.", "appears": { "title": "Where it appears", "editMetadata": "Edit Metadata", "details": "Details tab", "filters": "Filters", "table": "Table and sort", "tableBody": "Available as a table column and a sort option", "files": "Files", "filesWritten": "Written into EPUB and FB2 files in {libraries}, where writing metadata to files is on.", "filesNotWritten": "Not written into files: none of these libraries write metadata to EPUB or FB2 files.", "exports": "Exports" }, "archiveAction": "Archive field", "archiveConfirm": "Archive {label}?", "archiveConsequence": "{count, plural, =0 {It leaves Edit Metadata, filters and exports. Restore it from Archived at any time.} one {It leaves Edit Metadata, filters and exports. # value stays stored until the field is deleted.} other {It leaves Edit Metadata, filters and exports. # values stay stored until the field is deleted.}}", "create": "Create field", "onLibraries": "On {count} of {total} libraries", "onAllLibraries": "On all {total} libraries", "archivedBadge": "Archived", "archivedTitle": "Archived {when}.", "archivedBody": "{count, plural, =0 {This field is hidden from books, filters and exports. It holds no values.} one {This field is hidden from books, filters and exports. # stored value is kept and comes back on restore.} other {This field is hidden from books, filters and exports. # stored values are kept and come back on restore.}}", "facts": { "type": "Type", "libraries": "Libraries", "valuesKept": "Values kept", "fileKey": "File key", "created": "Created", "archived": "Archived" }, "deleteQuestion": "Delete {label} for good?", "deleteConsequence": "{count, plural, =0 {It holds no values. This cannot be undone.} one {Its # stored value is removed from every book. Files already written keep their copy. This cannot be undone.} other {Its # stored values are removed from every book. Files already written keep their copy. This cannot be undone.}}", "deleteConfirmLabel": "Type the field name to confirm", "deleteConfirmPlaceholder": "Type {label} to confirm" } }, "tabs": { "providers": "Providers", "field-rules": "Field Rules", "custom-fields": "Custom Fields", "genre-blocklist": "Genre Blocklist", "score": "Confidence Score", "auto-fetch": "Books", "authors": "Authors", "search-cache": "Search Cache" }, "tabTitles": { "providers": "Providers", "field-rules": "Field-Level Rules", "custom-fields": "Custom Metadata", "genre-blocklist": "Genre Blocklist", "score": "Confidence Score", "auto-fetch": "Book Auto-Fetch", "authors": "Author Auto-Fetch", "search-cache": "Search Cache" }, "tabSubtitles": { "providers": "Enable external metadata sources and configure their credentials.", "field-rules": "Control which provider supplies each metadata field and how values are merged across your libraries.", "custom-fields": "Define custom metadata fields and choose which libraries use them.", "genre-blocklist": "Prevent unwanted provider genre values from being written to books.", "score": "How each metadata field counts towards the completeness score shown on every book.", "auto-fetch": "Automatically fetch covers, descriptions, and other details when new books are added to your library.", "authors": "Automatically fetch biographies and profile photos when new authors appear in your library.", "search-cache": "Reuse provider answers so repeat searches are fast and still work when a provider is down." }, "preferences": { "toast": { "saved": "Metadata preferences saved", "saveFailed": "Could not save metadata preferences. Check your connection and try again.", "globalReset": "Global field rules reset to system defaults", "libraryReset": "Library reset to the global rules", "resetFailed": "Could not reset metadata preferences. Check your connection and try again." } } }, "reader": { "resetToDefaults": "Reset to defaults", "all": { "title": "Reader", "subtitle": "Configure defaults for all reading modes in one place." }, "general": { "title": "Reading", "subtitle": "General behavior that applies across all reader types.", "storageLabel": "Where to save reader preferences", "deviceOnly": "This device only", "deviceOnlyHint": "Preferences stay in your browser. Best if you always read on this device, or want different settings per device.", "myAccount": "My account", "myAccountHint": "Preferences are saved to your account. Best if you log in from multiple devices and want a consistent experience everywhere.", "active": "Active", "notAvailable": "Not available", "demoCannotChangeStorage": "Demo-restricted account cannot change reader storage mode", "preferencesSynced": "Preferences will now be synced", "preferencesLocal": "Preferences will stay on this device", "storageUpdateFailed": "Failed to update storage mode", "storageUpdateError": "An error occurred while updating storage mode" }, "ebook": { "title": "eBook Reader", "subtitle": "Default settings applied when opening EPUB, MOBI, FB2, and TXT files.", "newBooks": "New Books", "applySettings": "Apply my settings to new books", "applySettingsHint": "When off, new books open with the publisher's own fonts and layout. Your settings only apply once you change something in-reader.", "layout": "Layout", "readingFlow": "Reading flow", "readingFlowHint": "Paginated flips pages; scrolled flows continuously", "paginated": "Paginated", "scrolled": "Scrolled", "fixedLayoutSpread": "Fixed-layout page spreads", "fixedLayoutSpreadHint": "Default for manga, comics, and image-based EPUBs", "bookDefault": "Book default", "singlePage": "Single page", "columns": "Columns", "columnsHint": "Number of text columns per page", "theme": "Theme", "darkMode": "Dark mode", "darkModeHint": "Use the dark variant of the selected theme", "typography": "Typography", "font": "Font", "fontHint": "Typeface used for body text", "fontStyle": "Font style", "fontStyleHint": "Weight and slant of body text. Bold and italic in the book stay relative to it.", "builtInFonts": "Built-in fonts", "yourFonts": "Your Fonts", "fontSize": "Font size", "fontSizeHint": "Base text size in pixels", "lineHeight": "Line height", "lineHeightHint": "Vertical spacing between lines", "paragraphSpacing": "Paragraph spacing", "paragraphSpacingHint": "Space between paragraphs. Book default preserves the publisher's spacing.", "paragraphSpacingDefault": "Book default", "paragraphSpacingValue": "{value} em", "letterSpacing": "Letter spacing", "letterSpacingHint": "Space between letters. Book default preserves the publisher's spacing.", "wordSpacing": "Word spacing", "wordSpacingHint": "Space between words. Book default preserves the publisher's spacing.", "textIndent": "First-line indent", "textIndentHint": "Indent at the start of ordinary paragraphs. Book default preserves the publisher's indentation.", "custom": "Custom", "emValue": "{value} em", "justify": "Justify text", "justifyHint": "Align text to both margins", "hyphenation": "Hyphenation", "hyphenationHint": "Automatically break long words with hyphens", "advanced": "Advanced", "maxContentWidth": "Max content width", "maxContentWidthHint": "Maximum width of the text area in pixels", "columnGap": "Column gap", "columnGapHint": "Horizontal padding on each side of the text area" }, "pdf": { "title": "PDF Reader", "subtitle": "Default settings applied when opening PDF files.", "layout": "Layout", "scrollMode": "Scroll mode", "scrollModeHint": "Page flips one at a time; continuous scrolls through all pages", "page": "Page", "scrolled": "Scrolled", "pageSpread": "Page spread", "pageSpreadHint": "Which page number starts on the right in two-page view", "spreadNone": "None", "spreadOdd": "Odd", "spreadEven": "Even", "zoom": "Zoom", "defaultFit": "Default fit", "defaultFitHint": "How pages are scaled when a PDF is opened", "fitPage": "Fit Page", "fitWidth": "Fit Width", "custom": "Custom", "zoomLevel": "Zoom level", "zoomLevelHint": "Scale factor for custom zoom mode" }, "comics": { "title": "Comics Reader", "subtitle": "Default settings applied when opening CBZ, CBR, and CB7 files.", "view": "View", "readingMode": "Reading mode", "readingModeHint": "How pages are navigated - use \"Infinite (no gaps)\" for webtoons", "paginated": "Paginated", "infiniteSpaced": "Infinite (spaced)", "infiniteNoGaps": "Infinite (no gaps)", "pageView": "Page view", "pageViewHint": "Show one or two pages side by side", "single": "Single", "twoPage": "Two-page", "fitMode": "Fit mode", "fitModeHint": "How pages are scaled to fit the screen", "fitPage": "Page", "fitWidth": "Width", "fitHeight": "Height", "fitActual": "Actual", "readingDirection": "Reading direction", "readingDirectionHint": "Left-to-right for western comics; right-to-left for manga", "ltr": "L to R", "rtl": "R to L", "spreadAlignment": "Spread alignment", "spreadAlignmentHint": "Shift pairing by one page after the cover for off-by-one scans", "alignmentNormal": "Normal", "alignmentShifted": "Shifted", "spreadGap": "Spread gap", "spreadGapHint": "Space between pages in two-page view", "spreadGapValue": "{value}px", "widePageHandling": "Wide-page handling", "widePageHandlingHint": "Auto shows wide scans alone in two-page paginated mode", "widePageAuto": "Auto", "widePageDisable": "Disable", "forceTwoPage": "Force two-page on small screens", "forceTwoPageHint": "Bypass mobile auto-fallback when paginated two-page mode is selected", "autoAdvance": "Auto-advance to next book", "autoAdvanceHint": "Turn past the last page to open the next book in the series", "off": "Off", "on": "On", "display": "Display", "backgroundColor": "Background color", "backgroundColorHint": "Canvas color behind pages", "bgBlack": "Black", "bgGray": "Gray", "bgWhite": "White" }, "audio": { "title": "Audiobook Player", "subtitle": "Default settings applied when playing M4B, MP3, and other audio formats.", "playback": "Playback", "playbackSpeed": "Default playback speed", "playbackSpeedHint": "Speed multiplier applied when opening a new audiobook", "volume": "Default volume", "volumeHint": "Initial volume level (0 to 100%)", "skipControls": "Skip controls", "skipBack": "Skip back duration", "skipBackHint": "Seconds rewound on skip-back press", "skipForward": "Skip forward duration", "skipForwardHint": "Seconds advanced on skip-forward press" }, "fonts": { "title": "Fonts", "subtitle": "Upload custom fonts for use in the eBook reader.", "uploadFonts": "Upload Fonts", "notAvailableDemo": "Not available for demo accounts", "uploading": "Uploading...", "dropFilesHere": "Drop files here", "dragFontsPrefix": "Drag font files here, or", "browse": "browse", "fileTypesHint": "TTF, OTF, WOFF, WOFF2 - max 50 MB each", "yourFonts": "Your Fonts", "fontsUsed": "{count} / {max} used", "noFontsYet": "No fonts uploaded yet", "noFontsHint": "Drag a font file above to get started.", "fileCount": "{count, plural, =0 {no files} one {# file} other {# files}}", "pangram": "The quick brown fox jumps over the lazy dog", "renameFamily": "Rename family", "deleteFamily": "Delete family", "editVariant": "Edit weight/style", "deleteVariant": "Delete variant", "styleNormal": "Normal", "styleItalic": "Italic", "weightItalicOf": "{weight} Italic", "variableRange": "Variable {min}-{max}", "variableStyles": "{count, plural, one {# style} other {# styles}}", "weightThin": "Thin", "weightExtraLight": "Extra Light", "weightLight": "Light", "weightRegular": "Regular", "weightMedium": "Medium", "weightSemiBold": "Semi Bold", "weightBold": "Bold", "weightExtraBold": "Extra Bold", "weightBlack": "Black", "renameFamilyFailed": "Failed to rename font family", "renamedTo": "Renamed to \"{name}\"", "updateVariantFailed": "Failed to update font variant", "deleteFontFailed": "Failed to delete font", "deleteFamilyFailed": "Failed to delete font family", "demoCannotManage": "Demo-restricted account cannot manage fonts", "fileAdded": "\"{name}\" added", "uploadFailed": "Upload failed", "serverFontsTitle": "Server fonts (shared by admin)", "serverFontsHint": "These fonts come from your server administrator. Turn one off to keep it out of your reader.", "serverFontsShown": "{count} of {total} shown", "serverFontsAllHidden": "All server fonts are hidden. Your reader will only offer built-in and your own fonts.", "serverFontVisibilityFailed": "Failed to update server font visibility", "library": { "columns": { "use": "In use" }, "yourDefault": "Your default", "hiddenBadge": "Hidden", "emptyHint": "Add fonts above, or drop files anywhere on this page.", "dropTitle": "{count, plural, one {Drop to add # file to your fonts} other {Drop to add # files to your fonts}}", "limitReached": "You already have {limit} font files.", "filesUsed": "{count} of your {max} used", "nameHint": "This is the name in your reader’s font list.", "inReaderHint": "Your font list in Reader › Settings, with {name} chosen.", "showInReader": "Show in my reader", "showFamily": "Show {name} in my reader", "removeConsequenceBooks": "{count, plural, one {It is set on # of your books; that book goes back to its own font.} other {It is set on # of your books; they go back to their own fonts.}}", "removeConsequenceDefault": "It is your default font; books without their own setting go back to the book default.", "removeQuestion": "Remove {name} from your fonts?" } }, "bookDock": { "title": "Book Dock", "subtitle": "Configure how files are processed when they enter Book Dock.", "dropFolder": "Drop folder", "containerPath": "Container path", "containerPathHint": "Copy or move book files into this folder and they will be automatically picked up and processed by Book Dock. Subdirectories are supported.", "changePathPrefix": "To change this path, set", "changePathMiddle": "in your", "changePathSuffix": "file.", "metadata": "Metadata", "autoFetch": "Auto-fetch metadata from providers", "autoFetchHint": "Automatically fetch metadata from configured providers (Google Books, iTunes, Open Library, etc.) after a file is added to Book Dock.", "autoFinalize": "Auto-finalize", "enableAutoFinalize": "Enable auto-finalize", "enableAutoFinalizeHint": "Files with a metadata confidence score at or above the threshold will be finalized automatically.", "confidenceThreshold": "Confidence threshold: {value}%", "thresholdIgnored": "(ignored in Embedded only mode)", "destinationLibrary": "Destination library", "selectLibrary": "Select a library...", "metadataMode": "Metadata mode", "metadataModeSafeMerge": "Safe merge (recommended)", "metadataModeFetchedOnly": "Fetched only", "metadataModeEmbeddedOnly": "Embedded only", "destinationFolder": "Destination folder", "selectFolder": "Select a folder...", "saveSettingFailed": "Failed to save setting", "updateSettingFailed": "Failed to update setting", "autoFetchEnabled": "Auto-fetch enabled", "autoFetchDisabled": "Auto-fetch disabled", "autoFinalizeEnabled": "Auto-finalize enabled", "autoFinalizeDisabled": "Auto-finalize disabled", "destinationLibraryUpdated": "Destination library updated", "destinationFolderUpdated": "Destination folder updated", "confidenceThresholdUpdated": "Confidence threshold updated", "metadataModeUpdated": "Metadata mode updated" }, "fileNaming": { "title": "File Naming", "subtitle": "Control how files are organized on disk when uploaded and how they are named when downloaded using placeholder tokens.", "copy": "Copy", "previewLabel": "Preview:", "globalDefaults": "Global Defaults", "crossPlatform": "Cross-platform path sanitization", "crossPlatformHint": "Make generated file and folder names safe on Windows by replacing invalid characters and reserved names, and removing trailing dots and spaces. Disable only for Linux-only setups that intentionally keep those characters.", "fileAsBookDefault": "File as Book default", "fileAsBookDefaultHint": "Upload pattern for libraries using File as Book mode. Each file is one book.", "folderAsBookDefault": "Folder as Book default", "folderAsBookDefaultHint": "Upload pattern for libraries using Folder as Book mode. Each book must be in its own folder.", "downloadPattern": "Download Pattern", "downloadPatternHint": "Suggested filenames for single-file downloads and files inside export ZIPs.", "libraryOverrides": "Library Overrides", "noLibraries": "No libraries configured. Create one in Library settings to set custom naming patterns.", "badgeCustom": "Custom", "badgeDefault": "Default", "orgFolderAsBook": "Folder as Book", "orgFileAsBook": "File as Book", "resetToDefault": "Reset to default", "tokens": "Tokens", "clickTokenHint": "Click any token to copy it to your clipboard.", "copyValue": "Copy {value}", "modifiers": "Modifiers", "modifiersExplain": "Append a modifier inside a token to transform its value:", "modFirst": "First value only", "modSort": "Last, First format", "modInitial": "First letter only", "modFixed2": "Two decimal places", "modMax3": "Up to three values, otherwise nothing", "folderOnlyPrefix": "End a pattern with", "folderOnlySuffix": "to specify a folder only. The original filename will be preserved inside it.", "conditionalLogic": "Conditional Logic", "conditionalPart1": "Wrap in", "conditionalPart2": "to skip a segment when its token is empty. Use", "conditionalPart3": "for a default value.", "examples": "Examples", "exCalibre": "Calibre-style default", "exSeriesReader": "Series reader", "exCleanDownload": "Clean download filename", "exAlphabetical": "Alphabetical grouping with series", "exSeriesFallback": "Series or Standalone fallback", "exOptionalSubtitle": "Download with optional subtitle", "exMultilingual": "Multilingual library", "exPublisher": "Publisher-organized", "exStacked": "Stacked optional folders", "exFolderDrop": "Folder-drop with sort name", "caseWithYear": "with year", "caseNoYear": "no year", "caseInSeries": "in series", "caseStandalone": "standalone", "caseNoSeries": "no series", "caseFull": "full", "caseMinimal": "minimal", "caseWithLanguage": "with language", "caseNoLanguage": "no language", "caseWithPublisher": "with publisher", "caseNoPublisher": "no publisher", "caseAllSet": "all set", "copiedToClipboard": "{value} copied to clipboard", "copyTokenFailed": "Failed to copy token", "patternCopied": "Pattern copied to clipboard", "copyPatternFailed": "Failed to copy pattern", "labelCopied": "{label} copied to clipboard", "copyLabelFailed": "Failed to copy {label}", "patternHelp": "Pattern help", "patternHelpDescription": "Tokens, modifiers and ready-made patterns you can copy into any field.", "copyPreview": "Copy {label}", "copyExample": "Copy the {label} pattern", "invalidCharacters": "Pattern contains invalid characters", "fileAsBookSaved": "File as Book default saved", "folderAsBookSaved": "Folder as Book default saved", "downloadPatternSaved": "Download pattern saved", "savePatternFailed": "Failed to save pattern", "saveDownloadPatternFailed": "Failed to save download pattern", "crossPlatformEnabled": "Cross-platform path sanitization enabled", "crossPlatformDisabled": "Cross-platform path sanitization disabled", "crossPlatformSaveFailed": "Failed to save cross-platform path sanitization", "librarySaved": "Pattern saved for {name}", "librarySaveFailed": "Failed to save library pattern", "saveLibraryPattern": "Save pattern for {name}", "resetLibraryPattern": "Reset {name} to the default pattern", "tokenTitle": "Book title", "tokenSubtitle": "Book subtitle", "tokenAuthors": "Author(s), comma-separated", "tokenNarrators": "Narrator(s), comma-separated", "tokenYear": "Publication year", "tokenSeries": "Series name", "tokenSeriesIndex": "Series index (zero-padded)", "tokenPublisher": "Publisher", "tokenIsbn": "ISBN-13", "tokenLanguage": "Language", "tokenLibrary": "Library name", "tokenOriginalFilename": "Original filename (without extension)", "tokenExtension": "File extension (without dot)", "tokenReadaloud": "The word readaloud for an EPUB with media overlays", "patternHelpIntro": "Patterns use tokens like {titleToken} and {authorsToken}, plus modifiers and optional segments.", "browseTokensAndExamples": "Browse tokens and examples", "subtitleShort": "Folder and filename patterns for stored files.", "rule": { "fileAsBook": "File as Book default", "folderAsBook": "Folder as Book default", "download": "Download filename" }, "howItWorks": { "title": "How a path is chosen.", "summary": "A library with a pattern of its own wins. Every other library follows the global default for its organization mode. Changing a pattern does not move books already on disk; new uploads follow it from the next upload on." }, "filterRules": "Filter rules", "librariesGroup": "Libraries", "customCount": "{custom}/{total} custom", "noRuleMatches": "No rule matches \"{query}\".", "unsavedMarker": "Has unsaved changes", "backToRules": "Back to naming rules", "appliesToLibraries": "{count, plural, =0 {No libraries use this default} one {Applies to # library} other {Applies to # libraries}}", "downloadScope": "Downloads and export ZIPs", "badgeInherits": "Inherits default", "badgeUnsaved": "Unsaved", "patternLabel": "Pattern", "readOnlyFromGlobal": "Read-only, from the global default", "useGlobalDefault": "Use the global default", "resetToShipped": "Reset to shipped default", "addOverride": "Add an override", "inheritsNotice": "This library follows the {base}. Add an override to give it a pattern of its own.", "libraryRuleHint": "Overrides the {base} for this library only.", "scopeLibrary": "Applies to uploads into {name} only.", "scopeDownload": "Applies to every single-file download and every file inside an export ZIP.", "scopeGlobal": "{count, plural, one {Applies to # library that has no pattern of its own.} other {Applies to # libraries that have no pattern of their own.}}", "scopeGlobalNone": "No library uses this default right now; every library in this mode has its own pattern.", "unbalancedOptional": "An optional group is missing its closing angle bracket", "unbalancedToken": "A token is missing its closing brace", "structure": "Structure", "paletteOptional": "optional", "paletteOptionalHint": "Wraps a segment so it is dropped when a token inside it is empty", "paletteFallback": "fallback", "paletteFallbackHint": "Inside an optional group, the text used when the left side cannot be filled", "paletteSeparator": "folder", "paletteSeparatorHint": "Starts a new folder level", "modUpper": "UPPERCASE", "modLower": "lowercase", "recipesLabel": "Or start from a recipe", "recipe": { "seriesShelf": "Series shelf", "calibre": "Calibre style", "alphabetical": "Alphabetical", "flat": "Flat, no folders", "originalName": "Original filename", "authorTitle": "Author and title", "titleOnly": "Title only", "seriesOrdered": "Series ordered" }, "resultPanel": "Resolved result", "resultFor": "Result: {rule}", "copyResult": "Copy the resolved result", "resultCopied": "Resolved result copied to clipboard", "resultCopyFailed": "Failed to copy the resolved result", "sampleBookNote": "Sample book used for every preview", "missingMetadata": "If metadata is missing", "readaloudComparison": "Read-aloud comparison", "readaloudEpub": "Read-aloud EPUB", "plainEpub": "Plain EPUB", "caseNoSeriesLabel": "No series", "caseNoYearLabel": "No year", "caseNoAuthorLabel": "No author", "previewEmpty": "This pattern resolves to nothing, so the original filename would be used instead.", "previewEmptyShort": "Resolves to nothing", "crossPlatformShortHint": "Replaces characters Windows rejects. Previews reflect this setting.", "rulesSaved": "{count, plural, one {# naming rule saved} other {# naming rules saved}}", "rulesSaveFailed": "{count, plural, one {Failed to save # naming rule} other {Failed to save # naming rules}}", "rulesPartiallySaved": "Saved {saved}, failed {failed}. The rules that failed still have unsaved changes.", "save": { "unsaved": "{count, plural, one {# unsaved change} other {# unsaved changes}}", "upToDate": "No unsaved changes", "discard": "Discard", "action": "Save changes", "blocked": "Fix the invalid pattern before saving" }, "examplesDescription": "Idioms the recipes do not cover. A pattern ending in a slash resolves to a folder and keeps the uploaded filename inside it.", "examplesApply": "Apply", "examplesApplyAria": "Apply the {label} pattern", "examplesUploadOnly": "These are upload patterns, shown here for reference. Switch to a File as Book or Folder as Book rule to apply one.", "examplesFileModeOnly": "Folder as Book needs a filename segment of its own, so this idiom applies to File as Book libraries only.", "example": { "seriesOrStandalone": "Series, or a Standalone folder", "optionalSubtitle": "Optional subtitle", "languageFolder": "Language folder", "publisherFolder": "Publisher folder", "stackedOptional": "Stacked optional folders", "folderDrop": "Folder only, keep the uploaded filename" }, "exampleCase": { "complete": "Complete", "noSeries": "No series", "noSubtitle": "No subtitle", "noLanguage": "No language", "noPublisher": "No publisher" }, "unknownModifier": "Unknown modifier \"{modifier}\". It will be ignored, leaving the value unchanged.", "rulesNav": "Naming rules", "railFoot": "A library without a pattern of its own follows the default it sits under.", "usedBy": "Used by {libraries}", "followsBase": "Follows the {base}.", "copyPattern": "Copy pattern", "recipes": "Recipes", "recipesTitle": "Start from a recipe", "recipesReplace": "Replaces the whole pattern", "recipeInUse": "In use", "insert": "Insert", "insertToolbar": "Insert into the pattern", "insertOptional": "Optional", "insertFallback": "Fallback", "insertFolder": "Folder", "lineHint": "Press {enter} to start a new folder or type {brace} to pick a token. Click a folder icon to skip that folder when its value is missing.", "downloadLineHint": "Downloads have no folders, so only the last part of the pattern is used.", "tokenSuggestions": "Matching tokens", "noTokenMatch": "No token matches \"{query}\".", "uploadedNameKept": "Uploaded filename kept", "level": { "folder": "Folder {n}", "bookFolder": "Book folder", "file": "File name", "skipWhenEmpty": "Skip {level} when its value is missing", "skippedWhenEmpty": "Skipped when its value is missing. Click to always create this folder.", "alwaysCreated": "Always created. Click to skip this folder when its value is missing." }, "result": "Result", "previewWith": "Preview with", "previewWithAria": "Preview with {title}", "previewBook": { "sample": "Sample book", "longTitle": "Long title and series", "longSubtitle": "Long subtitle", "manyAuthors": "Five authors", "audiobook": "Audiobook", "standalone": "No series" }, "previewingCase": "Previewing: {case}", "showComplete": "Show complete", "previewStale": "The preview catches up once the pattern is fixed.", "noChange": "No change", "tagSkipped": "skipped", "tagFallback": "fallback", "tagBookFolder": "book folder", "tagUploadedName": "uploaded name", "tagShortened": "shortened to 255 bytes", "tagEmptyName": "empty name", "levelSkipped": "Skipped because {token} is empty", "levelEmptyName": "Empty folder name. Give this folder a fallback so it always has one.", "renameNote": "Books already on disk keep their paths. Libraries that rename files apply this pattern the next time a book's details are saved: {libraries}." }, "kobo": { "title": "Kobo Sync", "subtitle": "Pair your Kobo device to sync your library.", "copy": "Copy", "never": "Never", "justNow": "Just now", "minutesAgo": "{count}m ago", "hoursAgo": "{count}h ago", "daysAgo": "{count}d ago", "loadFailed": "Failed to load", "devicePaired": "Device paired successfully", "devicePairedHint": "You're ready to set up your Kobo. Follow the instructions below.", "syncUrl": "Sync URL", "urlNotShownAgain": "This URL will not be shown again. Keep it private.", "registeredDevices": "Registered Devices", "addDevice": "Add device", "deviceName": "Device name", "deviceNamePlaceholder": "e.g. My Kobo Libra", "creating": "Creating...", "createDevice": "Create device", "createDeviceFailed": "Failed to create device", "deviceRegistered": "Device \"{name}\" registered", "noDevicesYet": "No devices yet", "noDevicesHint": "Add a device to start syncing your books to your Kobo.", "lastSync": "Last sync: {time}", "renameDevice": "Rename device", "revokeAccess": "Revoke access", "deviceRenamed": "Device renamed", "renameDeviceFailed": "Failed to rename device", "revokeConfirm": "Revoke access for \"{name}\"? The device will not be able to sync until re-paired.", "accessRevoked": "Access revoked for \"{name}\"", "revokeFailed": "Failed to revoke access", "syncUrlCopied": "Sync URL copied to clipboard", "syncUrlCopyFailed": "Failed to copy sync URL", "syncPreferences": "Sync Preferences", "twoWaySync": "Two-way progress sync", "twoWaySyncHint": "Sync reading position between BookOrbit and Kobo. Requires KEPUB delivery for precise locations and reliable page restore.", "syncHighlights": "Sync BookOrbit highlights to Kobo", "syncHighlightsHint": "Send highlights made in BookOrbit or KOReader to your Kobo. Kobo highlights are imported into BookOrbit even when this is off. Linked annotations sync edits and deletes both ways. Requires KEPUB delivery; the book on Kobo must be the KEPUB downloaded from BookOrbit.", "storeSync": "Include Kobo store titles", "storeSyncHint": "Also deliver books from your Kobo account, including Kobo Plus and purchases, alongside your BookOrbit library. Without this, only BookOrbit books reach the device. Store titles are downloaded from Kobo directly and are not added to your BookOrbit library.", "fullSizeCovers": "Full-size covers", "fullSizeCoversHint": "Send each cover at your Kobo's screen resolution, so sleep screens and full-screen covers stay sharp. Turn this off to send smaller covers that sync faster. A cover already on a Kobo changes only when the book's cover changes.", "convertKepub": "Convert to KEPUB", "convertKepubHint": "Send eligible EPUBs as KEPUB. This stays on when progress sync or BookOrbit-to-Kobo highlights are enabled. On the next Kobo sync, affected books are offered again as KEPUB downloads; remove any old EPUB copy if Kobo keeps opening it.", "forceHyphenation": "Force hyphenation", "forceHyphenationHint": "Ensures consistent text justification. This will regenerate cached KEPUBs.", "progressThresholds": "Progress Thresholds", "progressThresholdsHint": "Define when Kobo reading progress updates your library status.", "markAsReading": "Mark as Reading", "markAsReadingHint": "Minimum percentage to move a book to \"Reading\".", "markAsFinished": "Mark as Finished", "markAsFinishedHint": "Percentage threshold to mark a book as \"Finished\".", "kepubLimit": "KEPUB conversion limit", "kepubLimitHint": "Books above this limit are sent as regular EPUBs, so BookOrbit will not sync their reader position back to Kobo.", "changesMustBeSaved": "Changes must be saved to take effect.", "saving": "Saving...", "saveSyncSettings": "Save Sync Settings", "thresholdOrderError": "Reading threshold must be less than finished threshold", "saveSettingsFailed": "Failed to save settings", "settingsSaved": "Kobo sync settings saved", "saveFailed": "Failed to save", "activity": { "waitingForActivity": "Waiting for activity", "needsAttention": "Needs attention", "syncHealthy": "Sync healthy", "never": "Never", "none": "None", "unknown": "Unknown", "failureCount": "{count, plural, one {# failure} other {# failures}}", "noActivityRecorded": "No Kobo sync activity has been recorded.", "lastSuccess": "Last success {time}", "lastFailure": "Last failure {time}", "noFailedActivity": "No failed Kobo activity in recent history.", "noActivityYet": "No Kobo activity yet.", "event": { "librarySync": "Library checked for updates", "bookDownload": "Book downloaded", "progressUpdate": "Reading position updated", "annotationsPull": "Highlights sent to Kobo", "annotationsPush": "Highlights received from Kobo" }, "outcome": { "failed": "Failed", "noUpdates": "No updates", "noChanges": "No changes", "pending": "Pending", "completed": "Completed", "downloaded": "Downloaded", "updated": "Updated", "sent": "Sent", "imported": "Imported" }, "failure": { "librarySync": "Library check did not complete", "bookDownload": "Download did not complete", "progressUpdate": "Reading position did not update", "annotationsPull": "Highlights were not sent", "annotationsPush": "Highlights were not imported" }, "chip": { "morePending": "More pending", "noUpdatesPending": "No updates pending", "bookCount": "{count, plural, one {# book} other {# books}}", "deletedAnnotations": "{count} deleted annotations", "deviceAlreadyCurrent": "Device already current", "freshHighlightData": "Fresh highlight data", "created": "{count} created", "updated": "{count} updated", "deleted": "{count} deleted", "unchanged": "{count} unchanged" }, "readingPositionSyncedTitle": "Reading position synced: {title}", "readingPositionSynced": "Reading position synced", "labelWithTitle": "{label}: {title}", "updateCount": "{count, plural, one {# update} other {# updates}}", "directionToKobo": "BookOrbit -> Kobo", "directionToBookOrbit": "Kobo -> BookOrbit", "twoWaySyncEnabled": "Two-way sync enabled", "deviceProgressSaved": "Device progress saved", "summary": { "noLibraryUpdatesPending": "No library updates are pending for this device", "libraryUpdatesPrepared": "{count, plural, one {# library update prepared for the device} other {# library updates prepared for the device}}", "bookDownloadedBy": "{title} was downloaded by {device}", "booksDownloaded": "{count, plural, one {# book downloaded} other {# books downloaded}}", "progressUpdatesSyncedFor": "{count, plural, one {# progress update synced for {title}} other {# progress updates synced for {title}}}", "progressUpdatesSynced": "{count, plural, one {# progress update synced} other {# progress updates synced}}", "newReadingPositionFor": "Kobo reported a new reading position for {title}", "newReadingPosition": "Kobo reported a new reading position", "noHighlightChangesNeededFor": "No highlight changes needed for {title}", "noHighlightChangesNeeded": "No highlight changes needed", "highlightsSentToKoboFor": "{count, plural, one {# highlight sent to Kobo for {title}} other {# highlights sent to Kobo for {title}}}", "highlightsSentToKobo": "{count, plural, one {# highlight sent to Kobo} other {# highlights sent to Kobo}}", "noKoboHighlightChangesFor": "No Kobo highlight changes for {title}", "noKoboHighlightChanges": "No Kobo highlight changes", "highlightsImportedFromKoboFor": "{count, plural, one {# highlight imported from Kobo for {title}} other {# highlights imported from Kobo for {title}}}", "highlightsImportedFromKobo": "{count, plural, one {# highlight imported from Kobo} other {# highlights imported from Kobo}}" }, "timeRange": "{from} to {to}", "eventsGrouped": "{count, plural, one {# event grouped} other {# events grouped}}", "removedDevice": "Removed device", "loadMoreFailed": "Failed to load more history", "historyRefreshed": "Kobo sync history refreshed", "refreshFailed": "Failed to refresh history", "recentActivity": "Recent Kobo Activity", "filterAll": "All", "filterFailures": "Failures", "refresh": "Refresh", "loadingActivity": "Loading Kobo activity...", "noActivityHint": "Recent sync activity will appear after a paired Kobo contacts BookOrbit.", "error": "Error", "loading": "Loading...", "loadMore": "Load more activity" }, "howBooksSynced": { "title": "How books are synced", "body": "To send books to your Kobo device, you must enable {syncToKobo} on the collections containing those books. Open any collection from the sidebar, click the Edit icon, and toggle {syncToKobo}. Books that are not part of an enabled collection will not sync." }, "nextSteps": { "title": "Next Steps", "step1": "1. Configure your Kobo device to sync with the Sync URL above.", "step2": "2. In BookOrbit, go to any collection from the sidebar, click the Edit icon, and enable {syncToKobo}. Only books inside sync-enabled collections will download to your device." }, "syncToKobo": "Sync to Kobo", "tabs": { "syncSettings": "Sync Settings", "activityLog": "Activity Log" } }, "koreader": { "title": "KOReader Sync", "subtitle": "Browse your BookOrbit catalog in KOReader and sync progress, reading activity, highlights, and annotation changes.", "tabs": { "sync": "Sync Settings", "fileNaming": "File Naming" }, "fileNaming": { "accountTitle": "Account default KOReader pattern", "accountDescription": "Sets the default relative folder and filename used by BookOrbit plugin downloads for your KOReader account. Device-specific rules can override it below.", "defaultPattern": "Default book path pattern", "accountHelp": "Your account default for KOReader plugin downloads unless a device has a custom rule.", "accountHint": "Used by your KOReader devices that do not have a custom override.", "preview": "Preview", "saveAccount": "Save account default", "deviceTitle": "KOReader device overrides", "deviceDescription": "Customize any combination of default, series, and standalone paths. Empty device-specific rows inherit the device default, which itself can inherit the account default KOReader pattern.", "noDevices": "Devices appear here after they sync with BookOrbit.", "customOrganization": "Custom organization", "usingAccountDefault": "Using account default", "deviceDefaultHelp": "Fallback for this device. Leave it equal to the account default to inherit future changes automatically.", "seriesBooks": "Books in a series", "seriesHelp": "Optional path used only for books with series metadata. Leave empty to use this device's default path pattern.", "standaloneBooks": "Books without a series", "standaloneHelp": "Optional path used only for books without series metadata. Leave empty to use this device's default path pattern.", "inheritPlaceholder": "Leave empty to use this device's default pattern", "useAccount": "Use account default", "saveOverride": "Save override", "loadFailed": "Failed to load file organization settings", "accountRequired": "Enter a default book path pattern before saving.", "accountSaved": "Account default KOReader pattern saved", "accountSaveFailed": "Failed to save file organization settings", "deviceUsesAccount": "Device now uses the account default KOReader pattern", "deviceSaved": "Device organization override saved", "deviceSaveFailed": "Failed to save device override", "deviceResetFailed": "Failed to reset device override" }, "loadingSettings": "Loading KOReader settings...", "loadFailed": "Failed to load KOReader settings", "never": "Never", "justNow": "Just now", "minutesAgo": "{count}m ago", "hoursAgo": "{count}h ago", "daysAgo": "{count}d ago", "unknown": "Unknown", "updateAvailable": "Update available", "manualUpdateRequired": "Manual update required", "manualUpdateExplanation": "This plugin version cannot install its own updates. Download the plugin and copy bookorbit.koplugin to koreader/plugins/ on this device.", "upToDate": "Up to date", "versionUnknown": "Version unknown", "latestPlugin": "Latest plugin: v{version}", "latestPluginUnavailable": "Latest plugin unavailable", "notConfigured": "KOReader sync is not configured", "notConfiguredHint": "Create one set of sync credentials, then use them with the BookOrbit KOReader plugin for browsing, downloads, progress, reading events, highlights, and deletes.", "createCredentials": "Create credentials", "createFormTitle": "Create KOReader Sync Credentials", "createFormHint": "These credentials authenticate your KOReader devices with BookOrbit.", "username": "Username", "usernamePlaceholder": "e.g. myreader", "password": "Password", "passwordPlaceholder": "Min 6 characters", "changeCredentials": { "action": "Change credentials", "title": "Change KOReader credentials", "description": "Each BookOrbit account has one KOReader credential set. Change it here without deleting synced data.", "newPassword": "New password", "usernameInvalid": "The username must be between 3 and 100 characters.", "passwordPlaceholder": "Leave blank to keep the current password", "passwordHint": "Leave this blank to keep the current password.", "passwordInvalid": "The password must be between 6 and 128 characters.", "deviceNotice": "Devices using the previous login must be reconnected or updated with a newly downloaded plugin package.", "showPassword": "Show new password", "hidePassword": "Hide new password", "save": "Save credentials", "saving": "Saving...", "updated": "KOReader credentials updated", "updateFailed": "Failed to update KOReader credentials" }, "creating": "Creating...", "create": "Create", "credentialsCreated": "KOReader sync credentials created", "createCredentialsFailed": "Failed to create credentials", "status": "KOReader Status", "refresh": "Refresh", "progressSync": "Progress sync", "progressSyncHint": "Allow KOReader devices to sync progress, reading activity, highlights, and annotation deletes with BookOrbit.", "lastSync": "Last sync", "syncedBooks": "Synced books", "bookCount": "{count, plural, =0 {no books} one {# book} other {# books}}", "devices": "Devices", "deviceCount": "{count, plural, =0 {no devices} one {# device} other {# devices}}", "credentialsCreatedLabel": "Credentials created", "setup": "Setup", "pluginServerUrl": "Plugin server URL", "syncUrl": "KOReader sync URL", "syncUrlHint": "Works with the BookOrbit plugin and KOReader's built-in progress sync.", "copied": "Copied", "copyUrl": "Copy URL", "preconfiguredPlugin": "Preconfigured BookOrbit plugin", "preconfiguredPluginHintPrefix": "Download a zip with the server URL and your sync login already configured. The plugin includes catalog browsing and sync. Copy the folder to", "preconfiguredPluginHintSuffix": "and restart KOReader.", "latestPluginNote": "{label}. Device updates run from the BookOrbit menu in KOReader.", "preparing": "Preparing...", "downloadPlugin": "Download Plugin", "noDevicesSynced": "No devices have synced yet", "noDevicesSyncedHint": "Install the BookOrbit plugin for full sync, or configure KOReader's stock progress sync for progress-only updates.", "lastSyncLabel": "Last sync:", "lastBookLabel": "Last book:", "noneYet": "None yet", "pluginActivity": "Plugin Activity", "noPluginActivity": "No plugin activity has been reported yet.", "lastFullSync": "Last full sync: {time}", "latestPluginSuffix": "- latest plugin v{version}", "matchedBooks": "Matched books", "readingEvents": "Reading events", "highlights": "Highlights", "syncedTotals": "Synced totals", "trashedHighlights": "Trashed highlights", "pendingDeletes": "{count, plural, =0 {no deleted highlights awaiting KOReader plugin acknowledgement.} one {# deleted highlight awaiting KOReader plugin acknowledgement.} other {# deleted highlights awaiting KOReader plugin acknowledgement.}}", "failedPositions": "{count, plural, =0 {no highlight positions need attention.} one {# highlight position needs attention.} other {# highlight positions need attention.}}", "setupGuide": "Setup Guide", "setupSteps": "KOReader setup steps", "setupStepsHint": "Use the BookOrbit plugin for catalog browsing, downloads, progress, reading events, and highlights. Use the stock plugin for progress only.", "pluginGuideTitle": "BookOrbit plugin", "pluginStep1": "Download the preconfigured plugin above.", "pluginStep2Prefix": "Unzip it and copy", "pluginStep2Middle": "to", "pluginStep2Suffix": "on your device.", "pluginStep3": "Restart KOReader. The server and login are configured automatically.", "pluginStep4Prefix": "Open", "pluginStep4Suffix": "to search, download, and link books to sync.", "stockGuideTitle": "Stock progress sync plugin", "stockStep1Prefix": "On your KOReader device, go to", "stockStep1Suffix": ".", "stockStep2": "Set the custom sync server to the URL shown above.", "stockStep2InlineUrl": "Set the custom sync server to the following URL:", "stockStep3": "Enter the username and password you created, then tap Login.", "locationNote": "BookOrbit saves KOReader-compatible EPUB locations from the web reader. Restore should land close to the same position, though exact line placement can vary by reader and EPUB layout.", "dangerZone": "Danger Zone", "deleteCredentials": "Delete KOReader credentials", "deleteCredentialsHint": "Remove sync credentials and disconnect all devices. Progress data will be retained.", "credentialsDeleted": "KOReader credentials deleted", "deleteCredentialsFailed": "Failed to delete credentials", "deleteConfirmTitle": "Delete KOReader credentials?", "deleteConfirmBody": "This will remove your sync credentials and disconnect all KOReader devices. Existing progress data will be kept.", "syncEnabled": "KOReader sync enabled", "syncDisabled": "KOReader sync disabled", "toggleSyncFailed": "Failed to toggle sync", "pluginLibrary": "Plugin Library", "hideAudioOnlyBooks": "Hide audiobook-only books", "hideAudioOnlyBooksHint": "KOReader cannot play audio, so books with only audio files stay out of the plugin's lists, search and downloads, as does a library holding nothing else. Books that also have an ebook still show.", "audioOnlyBooksHidden": "Audiobook-only books hidden in the plugin", "audioOnlyBooksShown": "Audiobook-only books shown in the plugin", "toggleAudioOnlyBooksFailed": "Failed to update the plugin library setting", "syncUrlCopied": "Sync URL copied to clipboard", "syncUrlCopyFailed": "Failed to copy sync URL", "statusRefreshed": "Sync status refreshed", "refreshFailed": "Failed to refresh", "pluginDownloaded": "Plugin downloaded. Copy bookorbit.koplugin from the zip to koreader/plugins/ on your device.", "pluginDownloadFailed": "Failed to download the plugin", "hashLinks": { "unmatchedTitle": "Unmatched KOReader Books", "unmatchedBooks": "Unmatched books", "manualTitle": "Manual KOReader Links", "refresh": "Refresh", "link": "Link", "change": "Change", "unlink": "Unlink", "hash": "Hash:", "lastOpened": "Last opened:", "firstSeen": "First seen:", "lastSeen": "Last seen:", "linked": "Linked:", "updated": "Updated:", "linkedTo": "Linked to {title}", "loadingUnmatched": "Loading unmatched books...", "loadingManual": "Loading manual hash links...", "noUnmatched": "No unmatched KOReader books.", "noManual": "No manual KOReader links.", "pageOf": "Page {page} of {total}", "showingRange": "Showing {start}-{end} of {total}", "unknownFile": "Unknown KOReader file {hash}", "unknownAuthor": "Unknown author", "noTitleOrAuthor": "No title or author reported", "bookNumber": "BookOrbit book #{id}", "toast": { "unmatchedRefreshed": "Unmatched books refreshed", "unmatchedRefreshFailed": "Failed to refresh unmatched books", "manualRefreshed": "Manual hash links refreshed", "manualRefreshFailed": "Failed to refresh manual hash links", "bookLinked": "Book linked", "linkUpdated": "Link updated", "linkFailed": "Failed to link book", "linkRemoved": "Link removed", "unlinkFailed": "Failed to unlink book", "unmatchedDismissed": "Unmatched book dismissed", "dismissFailed": "Failed to dismiss unmatched book", "allDismissed": "{count, plural, =0 {Dismissed no unmatched books} one {Dismissed # unmatched book} other {Dismissed # unmatched books}}", "dismissAllFailed": "Failed to dismiss all unmatched books", "reviewRefreshed": "Books to review refreshed", "reviewRefreshFailed": "Failed to refresh books to review", "reviewDismissed": "Book dismissed from review", "reviewDismissFailed": "Failed to dismiss book from review", "reviewAllDismissed": "{count, plural, =0 {Dismissed no books from review} one {Dismissed # book from review} other {Dismissed # books from review}}", "reviewDismissAllFailed": "Failed to dismiss all books from review", "suggestedLinked": "{count, plural, one {Linked # suggested book} other {Linked # suggested books}}", "suggestedPartlyLinked": "{linked, plural, one {Linked # suggested book.} other {Linked # suggested books.}} {failed, plural, one {# could not be linked and stays in the list.} other {# could not be linked and stay in the list.}}", "suggestedLinkFailed": "Could not link the suggested books" }, "modal": { "linkTitle": "Link KOReader book", "changeTitle": "Change KOReader link", "bookOrbitBook": "BookOrbit book", "searchPlaceholder": "Search your BookOrbit library", "minChars": "Enter at least 2 characters.", "searching": "Searching...", "noBooksFound": "No books found.", "untitledBook": "Untitled book", "selected": "Selected", "select": "Select", "loadMore": "Load more", "confirmTitle": "Confirm KOReader link", "koreader": "KOReader", "bookOrbit": "BookOrbit", "bookId": "Book ID: {id}", "syncedStatsNote": "Already synced stats will stay on their current BookOrbit book.", "chooseDifferent": "Choose different", "saving": "Saving...", "confirmLink": "Confirm link", "unlinkTitle": "Unlink KOReader book?", "unlinkBody": "Future syncs for this hash will stop resolving to {title} until it is linked again. Already synced stats will stay on their current BookOrbit book.", "unlinking": "Unlinking..." }, "dismiss": "Dismiss", "dismissAll": "Dismiss all", "dismissing": "Dismissing...", "unlinking": "Unlinking...", "unlinkConfirmTitle": "Unlink KOReader book?", "unlinkConfirmBody": "Future syncs for this hash will stop resolving to {title} until it is linked again. Already synced stats will stay on their current BookOrbit book.", "dismissConfirmTitle": "Dismiss {title}?", "dismissConfirmBody": "This removes it from your unmatched books list. If any device reports this hash again, it will reappear as a new entry.", "dismissAllConfirmTitle": "{count, plural, =0 {no unmatched books} one {Dismiss all # unmatched book?} other {Dismiss all # unmatched books?}}", "dismissAllConfirmBody": "This clears your entire unmatched books list, not just the current page. If any device reports one of these hashes again, it will reappear as a new entry.", "changeLinkTitle": "Change KOReader link", "linkBookTitle": "Link KOReader book", "bookOrbitBook": "BookOrbit book", "searchLibraryPlaceholder": "Search your BookOrbit library", "enterMinChars": "Enter at least 2 characters.", "searching": "Searching...", "noBooksFound": "No books found.", "untitledBook": "Untitled book", "selected": "Selected", "select": "Select", "loadMore": "Load more", "loadingMore": "Loading...", "confirmLinkTitle": "Confirm KOReader link", "bookId": "Book ID: {id}", "syncedStatsNote": "Already synced stats will stay on their current BookOrbit book.", "chooseDifferent": "Choose different", "saving": "Saving...", "confirmLink": "Confirm link", "reviewTitle": "KOReader Books to Review", "reviewHint": "Books without an automatic match and books you unlinked appear here. Unlinked books can still sync through an automatic match. Link a book to override that match, or dismiss it to remove it from this list.", "loadingReview": "Loading books to review...", "noReview": "No KOReader books to review.", "manualUnlinkConfirmBody": "Remove the manual link to {title} and return this book to the review list. Future syncs will use an automatic match if one exists. Already synced stats will stay on their current BookOrbit book.", "reviewDismissConfirmBody": "This removes it from your books to review. Automatic matching and existing sync data are kept. If a device reports the hash again without a match, it can reappear.", "reviewDismissAllConfirmTitle": "{count, plural, =0 {No books to review} one {Dismiss all # book to review?} other {Dismiss all # books to review?}}", "reviewDismissAllConfirmBody": "This clears your entire books to review list, including entries on other pages. Automatic matching and existing sync data are kept. If a device reports a hash again without a match, it can reappear.", "copyNote": "This KOReader copy is a different file from the one in BookOrbit. Reading status, rating, reading time and progress (as a percentage) will sync. Highlights and bookmarks will not. To sync everything, download the book to KOReader from BookOrbit.", "differentCopyHint": "Different file from the one in BookOrbit: progress syncs as a percentage, and highlights and bookmarks don't sync.", "suggestedMatch": "Suggested match", "possibleMatches": "{count, plural, one {# possible match} other {# possible matches}}", "morePossibleMatches": "{count, plural, one {More than # possible match} other {More than # possible matches}}", "possibleMatchesHint": "Books in your library with the same title and authors. Check the edition before you link.", "reviewMatch": "Review match", "chooseMatch": "Choose match", "linkSuggested": "Link suggested ({count})", "bulkLinkTitle": "{count, plural, one {Link # suggested book?} other {Link # suggested books?}}", "bulkLinkDescription": "Each KOReader book below has the same title and authors as exactly one book in your library. Check the list before linking.", "bulkLinkConfirm": "{count, plural, one {Link # book} other {Link # books}}", "bulkLinkListLabel": "Suggested links", "openCandidate": "Open {title} in a new tab" }, "remove": "Remove", "removing": "Removing...", "unmatchedBooks": "Unmatched books", "deviceRemoved": "Device removed", "removeDeviceFailed": "Failed to remove device", "removeDeviceConfirmTitle": "Remove {device}?", "removeDeviceConfirmBody": "This permanently deletes this device's synced progress, reading activity, and any unmatched-book entries no longer reported by another device. If the device syncs again later, it will reappear as a new entry.", "deleteDeviceDataConfirmTitle": "Delete synced data from {device}?", "deleteDeviceDataConfirmBody": "This permanently deletes this device's synced progress, page-by-page reading activity, and any unmatched-book entries no longer reported by another device. Reading sessions already recorded in your stats are kept. If the device syncs again later, it will reappear as a new entry.", "devicesHint": "Retiring a device hides it and keeps everything it has synced. Deleting its synced data cannot be undone.", "retire": "Retire", "retiring": "Retiring...", "restore": "Restore", "restoring": "Restoring...", "deleteSyncedData": "Delete data", "deletingSyncedData": "Deleting...", "deviceRetired": "Device retired", "deviceRestored": "Device restored", "retireDeviceFailed": "Failed to retire device", "restoreDeviceFailed": "Failed to restore device", "retiredDevices": "{count, plural, one {# retired device} other {# retired devices}}", "retiredOnLabel": "Retired" }, "opds": { "title": "OPDS", "subtitle": "Connect OPDS-compatible reading apps like KOReader or Thorium Reader to your library.", "copy": "Copy", "loadFailed": "Failed to load", "server": "Server", "catalogServer": "OPDS Catalog Server", "catalogServerHint": "Allow OPDS clients to browse and download books", "endpoint": "Endpoint", "accounts": "OPDS Accounts", "add": "Add", "addAccount": "Add account", "username": "Username", "usernameLabel": "Username", "usernamePlaceholder": "e.g. koreader", "password": "Password", "passwordPlaceholder": "Min 8 characters", "defaultSort": "Default Sort", "sortLabel": "Sort", "creating": "Creating...", "create": "Create", "noAccounts": "No OPDS accounts yet. Create one to start using OPDS clients.", "hideDetails": "Hide details", "showDetails": "Show details", "copyUsername": "Copy username", "notes": "OPDS Notes", "notesBody": "Use OPDS accounts in reader apps. Keep credentials private and rotate passwords if shared accidentally.", "deleteConfirmTitle": "Delete OPDS account?", "deleteConfirmBody": "Delete \"{username}\". This action cannot be undone.", "sortRecent": "Recently Added", "sortTitleAsc": "Title (A-Z)", "sortTitleDesc": "Title (Z-A)", "sortAuthorAsc": "Author (A-Z)", "sortAuthorDesc": "Author (Z-A)", "sortSeriesAsc": "Series (A-Z)", "sortSeriesDesc": "Series (Z-A)", "serverEnabled": "OPDS server enabled", "serverDisabled": "OPDS server disabled", "updateSettingsFailed": "Failed to update OPDS settings", "urlCopied": "OPDS URL copied to clipboard", "urlCopyFailed": "Failed to copy OPDS URL", "createUserFailed": "Failed to create OPDS user", "userCreated": "OPDS user \"{username}\" created", "sortOrderUpdated": "Sort order updated for \"{username}\"", "updateSortFailed": "Failed to update sort order", "userDeleted": "OPDS user \"{username}\" deleted", "deleteUserFailed": "Failed to delete OPDS user", "labelCopied": "{label} copied", "copyLabelFailed": "Failed to copy {label}" }, "tabs": { "general": "General", "ebook": "eBook", "pdf": "PDF", "comics": "Comics", "audio": "Audiobook", "fonts": "Fonts" } }, "system": { "tabs": { "file-naming": "File Naming", "book-dock": "Book Dock", "requests": "Requests", "maintenance": "Maintenance", "audit-log": "Audit Log" }, "requests": { "title": "Requests", "subtitle": "Where releases are found, what fetches them, and what happens once they land.", "tabs": { "sources": "Sources", "clients": "Download clients", "automation": "Automation" }, "loading": "Loading download clients...", "clients": "Download clients", "addClient": "Add client", "editClient": "Edit client", "deleteClient": "Delete {name}", "clientsEmpty": { "title": "No download client yet", "body": "A direct HTTP download needs no client. Connect one so BookOrbit can fetch releases delivered by torrent or Usenet too.", "note": "qBittorrent, Transmission, Deluge, NZBGet and SABnzbd are supported." }, "summary": "{type} - category {category}, priority {priority}", "disabled": "Disabled", "test": "Test connection", "testSaveFirst": "Save your changes before testing", "testOk": "Connected to {client} {version}", "testOkNoVersion": "Connected to {client}", "lastTestOk": "Last tested {time}: connected", "lastTestFailed": "Last tested {time}: {error}", "saved": "Download client saved", "deleted": "Download client removed", "clientTypes": { "qbittorrent": "qBittorrent", "transmission": "Transmission", "deluge": "Deluge", "nzbget": "NZBGet", "sabnzbd": "SABnzbd" }, "color": { "label": "Color", "hint": "Marks this client in transfer details. The transfer protocol keeps its own color.", "none": "No color" }, "fields": { "name": "Name", "type": "Client type", "baseUrl": "Base URL", "username": "Username", "password": "Password", "apiKey": "API key", "passwordKeep": "Leave blank to keep the stored password", "apiKeyKeep": "Leave blank to keep the stored API key", "passwordClear": "Clear", "passwordKeepAction": "Keep", "passwordWillClear": "The stored password is removed when you save", "apiKeyWillClear": "The stored API key is removed when you save", "category": "Category", "categoryHint": "Tags the downloads BookOrbit adds, so it only ever acts on its own.", "priority": "Priority", "enabled": "Enabled", "useHardlinks": "Use hardlinks", "allowPrivateAddress": "Allow private addresses", "allowPrivateAddressHint": "Needed when the client runs on your local network or the same machine.", "passwordBrief": "Stored encrypted.", "apiKeyBrief": "Found in SABnzbd under Config > General. Stored encrypted.", "useHardlinksBrief": "Imports without using the disk twice. Falls back to a copy across filesystems." }, "mappings": { "title": "Path mappings", "hint": "Translate the paths the client reports into paths BookOrbit can open. Needed when the two run in separate containers.", "add": "Add mapping", "remove": "Remove mapping", "remotePath": "Client path", "localPath": "BookOrbit path", "brief": "Required. Declares the directory BookOrbit may import from; when the client sees the same files at the same paths, map the download directory to itself.", "identityExample": "Same filesystem? Use the same path on both sides, for example /downloads on the left and /downloads on the right." }, "hardlink": { "test": "Test hardlink", "checking": "Checking...", "works": "Hardlinks work here: imports will not use the disk twice.", "unavailable": "Hardlinks are not available here: imports will copy, using the space twice.", "link_refused": "This filesystem refused the link ({code}): imports will copy, using the space twice.", "download_dir_unwritable": "BookOrbit cannot write to the download directory ({code}), so hardlinking could not be tested.", "localMissing": "BookOrbit cannot see that path.", "dockMissing": "The Book Dock folder is not readable." }, "reconciliation": { "action": "Reconcile", "clean": "Every owned client item matches a retained BookOrbit download attempt.", "unsupported": "This client cannot enumerate items by BookOrbit's ownership marker. For Deluge, enable the Label plugin; for Transmission, configure a category folder.", "truncated": "The client returned more than 1,000 owned items. Resolve the visible entries, then reconcile again.", "orphan": "No retained BookOrbit attempt owns this client item.", "failedAttempt": "The client still holds this item, but its attempt for \"{title}\" is marked failed.", "missing": "This {status} attempt is no longer present in the download client.", "adopt": "Attach to {title}", "adopted": "Attached the client item to {title}", "remove": "Remove from client", "removed": "Removed the orphaned client item", "removeTitle": "Remove this orphaned client item?", "removeDescription": "{name} is removed from the download client. Its downloaded files are kept.", "notOrphan": "That client item is still attached to a BookOrbit download attempt.", "notAdoptable": "That client item or failed attempt changed and can no longer be attached. Reconcile again." }, "errors": { "loadFailed": "Could not load download clients", "saveFailed": "Could not save that download client", "deleteFailed": "Could not remove that download client", "testFailed": "Could not reach that download client", "nameAndUrlRequired": "A name and a base URL are required", "nameTaken": "A download client with that name already exists", "urlUnsafe": "That base URL could not be reached. Check the address and that it uses http or https.", "urlPrivate": "That address is on a private or local network. Turn on \"Allow private addresses\" if the client runs there.", "encryptionKeyMissing": "Set BOOK_REQUEST_ENCRYPTION_KEY before saving a client credential. Generate one with: openssl rand -hex 32", "encryptionKeyChanged": "The stored client credential could not be read. BOOK_REQUEST_ENCRYPTION_KEY may have changed since it was saved.", "pathNotAbsolute": "Path mappings must use absolute paths on both sides", "nameRequired": "Give this client a name.", "urlRequired": "Enter the address BookOrbit should reach this client at.", "mappingRequired": "Add at least one path mapping, so BookOrbit knows which directory it may import from.", "apiKeyRequired": "Enter the SABnzbd API key from Config > General." }, "encryptionKeyMissing": "BOOK_REQUEST_ENCRYPTION_KEY is not set, so a client credential cannot be saved. Generate one with: openssl rand -hex 32", "confirmDelete": { "title": "Remove this download client?", "description": "{name}'s address and stored credential are deleted, and requests downloading there stop updating. Turn it off instead to keep the details.", "confirm": "Remove client" }, "indexers": { "title": "Direct feeds", "hint": "Connect an individual Torznab feed for torrents or Newznab feed for Usenet releases.", "allDisabled": "Every source below is switched off, so no request search will find anything. Switch at least one back on.", "loading": "Loading indexers...", "empty": { "title": "No sources yet", "body": "BookOrbit bundles no sources of its own, so a request search finds nothing until you add one. Choose the setup that fits your indexers.", "bodyOneWay": "BookOrbit bundles no sources of its own, so a request search finds nothing until you add one.", "responsibility": "What a source you add indexes is your responsibility.", "prowlarrTitle": "Connect Prowlarr", "prowlarrBody": "Manage several torrent and Usenet indexers through one connection.", "recommended": "Recommended", "pluginTitle": "Install a plugin", "pluginBody": "One file that teaches BookOrbit to search a specific site. You supply it, then fill in its settings.", "torznabTitle": "Add a Torznab indexer", "torznabBody": "Point at a Prowlarr, Jackett or NZBHydra feed you already run. One per feed.", "builtInTitle": "Add an indexer", "builtInBody": "Point at a Torznab or Newznab feed you already use. One configuration per feed." }, "add": "Add indexer", "edit": "Edit indexer", "delete": "Delete {name}", "none": "No indexer yet.", "disabled": "Disabled", "test": "Test connection", "testSaveFirst": "Save your changes before testing", "testOk": "Connected to {name}", "toggleAria": "Search with {name}", "enabledNotice": "{name} will be searched", "disabledNotice": "{name} will not be searched", "lastTestOk": "Last tested {time}: connected", "lastTestFailed": "Last tested {time}: {error}", "saved": "Indexer saved", "deleted": "Source deleted", "unavailable": "This install has no \"{type}\" indexer type. Change the type or delete its plugin and saved configuration.", "pluginFailed": "The plugin in \"{directory}\" did not load: {reason}", "sources": { "title": "Sources", "hint": "Everything BookOrbit can search, grouped by connection.", "add": "Add source", "prowlarr": "Connect Prowlarr", "prowlarrHint": "Manage several torrent and Usenet indexers together.", "direct": "Add Torznab or Newznab", "directHint": "Connect one compatible feed directly.", "plugin": "Install a plugin", "pluginHint": "Add a specialized source implementation.", "activeSummary": "{count, plural, one {# active source} other {# active sources}}: {torrent} torrent, {usenet} Usenet, {direct} direct" }, "network": { "title": "Advanced network", "hint": "Only needed when the default path to this source does not work. What is allowed does not change: whatever address is reached is still checked the same way.", "resolvers": "DNS servers", "proxyUrl": "Proxy URL", "proxyHint": "An http or https proxy to send this source's requests through. SOCKS is not supported.", "brief": "Only needed when the default path to this source does not work.", "resolversBrief": "Comma separated. Used instead of the system resolver for this source only; blank uses the system one.", "proxyBrief": "An http or https proxy for this source. SOCKS is not supported." }, "types": { "torznab": "Torznab (Jackett, Prowlarr, NZBHydra)", "newznab": "Newznab" }, "fields": { "name": "Name", "type": "Indexer type", "baseUrl": "Base URL", "baseUrlHint": { "torznab": "The Torznab feed URL, without the query string. Jackett shows it on each indexer as \"Torznab Feed\".", "newznab": "The Newznab site URL or API endpoint, without a search query." }, "credential": { "apiKey": "API key", "sessionId": "Session ID" }, "credentialKeep": "Leave blank to keep the stored credential", "credentialClear": "Clear", "credentialKeepAction": "Keep", "credentialWillClear": "The stored credential is removed when you save", "enabled": "Enabled", "allowPrivateAddress": "Allow private addresses", "credentialBrief": "Stored encrypted.", "allowPrivateAddressBrief": "Off by default. Only needed when the source is on your local network.", "searchByIsbn": "Search by ISBN", "searchByIsbnBrief": "On by default. Turn it off if this source returns the wrong book for an exact ISBN, and it will be searched by title and author instead." }, "color": { "label": "Color", "hint": "Marks this source on every release it returns, so you can tell where a result came from before reading its name. Delivery protocols keep their own colors, which is why those colors are not offered here.", "none": "No color", "options": { "blue": "Blue", "indigo": "Indigo", "purple": "Purple", "pink": "Pink", "red": "Red", "orange": "Orange", "yellow": "Yellow", "lime": "Lime", "green": "Green", "teal": "Teal" } }, "mediaKinds": { "label": "Search this source for", "hint": "Turn off a medium this source is not worth asking about. An audiobook-only tracker behind a general proxy still says it carries everything, and searching it for ebooks costs a request on every search.", "notCarried": "This source does not carry it." }, "categories": { "title": "Categories", "brief": "The indexer's own category numbers, separated by commas." }, "settings": { "restoreDefault": "Restore defaults" }, "seeding": { "applyTracker": "Apply tracker seed goals", "applyTrackerBrief": "When a manual value is blank, use a valid goal reported by the tracker. When this is off, blank values use the download client's defaults. Manual values still apply.", "ratio": "Seed ratio", "ratioBrief": "A positive decimal. Blank inherits from the tracker or client.", "time": "Seed time (minutes)", "timeBrief": "A positive whole number. Blank inherits from the tracker or client.", "clientSupport": "qBittorrent accepts ratio and total seed time. Deluge and Transmission accept ratio only. Client global rules and whichever limit is reached first can stop seeding, so these values do not guarantee that every tracker minimum is met.", "futureGrabs": "Changes apply to future grabs. Existing or adopted torrents can retain client-specific limits. Turning tracker fallback off leaves client defaults active; it does not mean unlimited seeding.", "reset": "Reset seeding settings", "summary": { "title": "Policy summary", "ratio": "Ratio", "time": "Seed time", "manual": "Manual: {value}", "tracker": "Tracker fallback", "client": "Client default" }, "errors": { "ratio": "Enter a finite number greater than zero, or leave this blank.", "minutes": "Enter a whole number from 1 through 2,147,483,647, or leave this blank." } }, "confirmDelete": { "title": "Delete this source?", "description": "{name}'s address, settings and stored credential are deleted. Turn it off instead to stop searching it without losing them.", "confirm": "Delete source" }, "errors": { "loadFailed": "Could not load indexers", "saveFailed": "Could not save that indexer", "deleteFailed": "Could not delete that source", "testFailed": "Could not reach that indexer", "nameAndUrlRequired": "A name and a base URL are required", "nameTaken": "An indexer with that name already exists", "urlUnsafe": "That base URL could not be reached. Check the address and that it uses http or https.", "urlPrivate": "That address is on a private or local network. Turn on \"Allow private addresses\" if the indexer runs there.", "credentialRequired": "That indexer needs a credential before it can be used", "invalidSettings": "One or more source settings are invalid. Review the available choices.", "nameRequired": "Give this indexer a name.", "urlRequired": "Enter the address BookOrbit should search at." }, "editName": "Edit {name}", "editorDescription": "Settings for this indexer.", "chooseType": "Choose an indexer type", "chooseTypeHint": "Pick where BookOrbit should search. The form then asks only for what that source needs.", "builtIn": "Built in", "plugin": "Plugin", "typeDescriptions": { "torznab": "Your own Jackett, Prowlarr or NZBHydra. Uses categories and seed goals.", "newznab": "A Newznab-compatible Usenet indexer. Uses categories and requires an API key." }, "plugins": { "title": "Plugins", "hint": "A site BookOrbit can search, added as a single plugin file.", "directoryLink": "Browse open library plugins", "none": "No plugin installed. Install one to search a site the built-in protocols do not cover.", "install": "Install plugin", "installed": "Installed {label}.", "installFailed": "That plugin could not be installed.", "inspectFailed": "That file could not be read as a plugin.", "removeAction": "Delete plugin", "removed": "Deleted {type} and its sources.", "removeFailed": "That plugin could not be deleted.", "confirmRemove": "Delete the {label} plugin?", "replaces": "This replaces the {type} plugin already installed.", "restartRequired": "Restart BookOrbit for the plugin change to take effect.", "confirmInstall": "Install plugin", "configure": "Set up", "notSetUp": "Not set up yet", "brokenTitle": "A plugin did not load", "managedHint": "Installed on this server. Updating replaces its code. Deleting permanently removes the plugin and every source of this type.", "missingHint": "The plugin file is already gone. Delete this plugin entry to remove every remaining source, setting and stored credential for its type.", "removeWarning": "{count, plural, one {# source and its saved settings and credential will be permanently deleted with this plugin.} other {# sources and their saved settings and credentials will be permanently deleted with this plugin.}}", "configureAria": "Set up {label}", "usedBy": "{count, plural, one {used by # source} other {used by # sources}}", "unused": "no source uses it yet", "update": "Update plugin", "checkUpdates": "Check for updates", "updateCheckComplete": "Plugin update check complete.", "updateCheckFailed": "Could not check for plugin updates.", "updateInspectFailed": "The published plugin update could not be verified.", "reviewUpdate": "Review update", "updated": "Updated {label} to {version}.", "autoUpdate": "Install signed updates automatically", "autoUpdateFailed": "Could not change automatic updates for this plugin.", "installedVersion": "Installed version", "updateChannel": "Signed update channel", "signatureVerified": "The downloaded source matches the publisher's Ed25519 signature.", "updateStates": { "unsupported": "Manual updates", "unchecked": "Not checked yet", "current": "Up to date", "available": "Version {version} available", "custom": "Custom build", "failed": "Update check failed" }, "wrongType": "That file is the {found} plugin, not {expected}.", "replaceTitle": "Replace this plugin?", "replace": "Replace plugin", "reviewTitle": "Install this plugin?", "reviewDescription": "What the file declares about itself, and the code it will run.", "declares": "What it declares", "source": "What it will run", "type": "Type", "version": "Version", "versionLabel": "Plugin version {version}", "versionUnknown": "Plugin version unknown", "versionUnknownValue": "Unknown", "media": "Media", "credential": "Credential", "credentialRequired": "Required", "credentialNone": "None", "trustWarning": "A plugin runs inside BookOrbit with its access to your database, library files and encryption key. Install one only from a source you trust, and read it first.", "sectionTitle": "Plugin", "removeUnusedWarning": "The plugin will be permanently deleted from the server." }, "posture": "BookOrbit does not provide or endorse indexer sources. Every source here is one you configured, and you are responsible for what you search and download through it." }, "managers": { "add": "Add Prowlarr", "loading": "Loading Prowlarr connections...", "managedSources": "{count, plural, one {# managed indexer} other {# managed indexers}}", "protocol": { "torrent": "Torrent", "usenet": "Usenet" }, "saved": "Prowlarr settings saved", "deleted": "Prowlarr removed", "synced": "Prowlarr sources synchronized", "test": "Test connection", "sync": "Synchronize", "testOk": "Connected to Prowlarr {version}. Found {count, plural, one {# source} other {# sources}}.", "unavailable": "Unavailable", "priority": "Prowlarr priority {priority}", "toggleSource": "Search with {name}", "changeColor": "Change color for {name}", "sourceColor": "Source color", "sourceColorHint": "Marks releases returned by {name} throughout BookOrbit.", "noSources": "No compatible torrent or Usenet indexers were discovered. Synchronize after adding one in Prowlarr.", "unknown": "Unknown", "editorDescription": "Connection and source synchronization settings for Prowlarr.", "confirmDelete": "Remove this Prowlarr connection?", "deleteConsequence": "The connection, encrypted API key, and all synchronized sources are deleted. Downloads already in progress are not removed.", "fields": { "name": "Name", "color": "Connection color", "colorHint": "Marks this Prowlarr connection here. Each managed indexer has its own release color.", "baseUrl": "Base URL", "apiKey": "API key", "apiKeyHint": "Found in Prowlarr under Settings > General > Security. Stored encrypted.", "syncNew": "Enable newly discovered sources", "syncNewHint": "New Prowlarr indexers are searchable immediately. Sources you switch off here stay off after later synchronizations.", "autoExpand": "Retry without category filters", "autoExpandHint": "When an indexer answers successfully with no results, retry once without BookOrbit's book category filter.", "inheritSeedLimits": "Use Prowlarr seed limits", "inheritSeedLimitsHint": "Apply each torrent indexer's configured seed ratio and seed time to future downloads when no BookOrbit override exists.", "perIndexerTimeout": "Indexer timeout (seconds)", "perIndexerTimeoutHint": "How long one synchronized source may take. Slow FlareSolverr-backed indexers may need more time.", "overallBudget": "Prowlarr budget (seconds)", "overallBudgetHint": "Maximum wall-clock time shared by all sources from this Prowlarr connection during one search." }, "errors": { "load": "Could not load indexer managers", "nameTaken": "A Prowlarr connection with that name already exists", "urlPrivate": "That address is on a private or local network. Turn on \"Allow private addresses\" if Prowlarr runs there.", "required": "Enter a name, base URL, and API key.", "save": "Could not save the Prowlarr connection", "delete": "Could not remove the Prowlarr connection", "test": "Could not reach Prowlarr", "sync": "Could not synchronize Prowlarr sources", "source": "Could not change that source" } }, "automation": { "title": "Automation", "pipeline": "When a download finishes it passes through the Book Dock, where its title and author are read so the file can be named and filed correctly, and then it moves into the request's destination library on its own. It only stops for you if import checking is on and the file does not match what was requested.", "groupDownloads": "Automatic downloads", "groupImports": "Import checks", "stateOn": "On", "stateOff": "Off", "summaryOff": "Every approved request waits for a person to open the release picker and choose.", "summaryNoRetry": "An approved request downloads its best release on its own, as long as that release scores {score} or more. If it fails, the request waits for a person.", "summaryRetry": "An approved request downloads its best release on its own, as long as that release scores {score} or more. {count, plural, one {It is the only release tried before the request waits for a person.} other {Up to # releases are tried before the request waits for a person.}}", "howDownloads": "How automatic downloads work", "howImports": "How import checks work", "minScoreShort": "Nothing below this is downloaded unattended.", "autoRetryShort": "A failed download falls through to the runner-up.", "maxAttemptsShort": "The first attempt and every retry count towards this.", "verificationShort": "Below this, the file waits in the Book Dock for review.", "loading": "Loading the automation settings...", "loadFailed": "Could not load the automation settings", "saveFailed": "Could not save that setting", "saved": "Automation settings saved", "autoGrab": "Download the best release automatically", "noSourcesConfigured": "No search sources are set up, so nothing will be searched and every approved request will be handed straight back. Add one under Sources.", "noSourcesEnabled": "Every search source is switched off, so nothing will be searched and every approved request will be handed straight back. Switch one back on under Sources.", "autoGrabHint": "When a request is approved, its highest-scoring release goes straight to the download client and nobody has to open the release picker. Off by default, because matching a book to the right release is hard and a person is usually the better judge.", "autoGrabEnabled": "Automatic downloads are on", "autoGrabDisabled": "Automatic downloads are off", "minScore": "Minimum score for automatic download", "minScoreHint": "A release scoring below this is never downloaded automatically. Scores run to 100, and how well the title and author match makes up most of one, with format, file size, seeders and source priority behind it. If nothing scores high enough, the request waits for someone to pick a release by hand and says why it stopped.", "minScoreHintV2": "A release scoring below this is never downloaded automatically. Scores run to 100. Title and author relevance contributes most, followed by format and plausible file size, with swarm health and freeleech used when a source provides them. If nothing scores high enough, the request waits for someone to pick a release by hand and says why it stopped.", "autoRetry": "Try the next release after a failure", "autoRetryHint": "When an automatic download fails, the next-best release is tried instead of giving up. This covers a source refusing to hand the file over and a download that dies partway through. It only applies to releases BookOrbit chose itself: one an approver picked by hand stays failed and waits for them.", "maxAttempts": "Attempts per request", "maxAttemptsHint": "Every release BookOrbit sends to a download client for this request counts towards this limit: the first automatic attempt, anything tried after a source turned one down, and anything tried after a download failed. Set it to 1 to stop after the first attempt.", "autoSearch": "Keep looking for requests nothing was found for", "autoSearchShort": "An approved request nothing matched is searched for again later.", "autoSearchHint": "A request is searched for once when it is approved. If nothing good enough turns up, or the book has not been released yet, that request waits at approved and nothing looks for it again. Switch this on and BookOrbit keeps checking on its own, so a release posted next month is still found. It only runs while automatic downloads are on, since a search with nothing to do with what it finds only costs your sources traffic.", "autoSearchEnabledToast": "Requests will be searched for again", "autoSearchDisabledToast": "Requests will only be searched when they are approved", "autoSearchInterval": "Search again after", "autoSearchIntervalShort": "Counted from the last search, and stretched as a request ages.", "autoSearchIntervalHint": "How long to wait before looking again for a request nothing was found for. The wait doubles for each week a request has been waiting, up to eight times this figure, so a long backlog of old requests does not turn into daily traffic against every source you have.", "autoSearchIntervalUnit": "hours", "autoSearchMaxAge": "Stop looking after", "autoSearchMaxAgeShort": "Counted from when the request was made.", "autoSearchMaxAgeHint": "A request older than this is left alone. It stays approved and can still have a release picked by hand at any time; nothing looks for it automatically any more.", "autoSearchMaxAgeUnit": "days", "verify": "Check imports against the request", "verifyOnHint": "Every downloaded file is compared with the book that was requested before it is filed. Anything that does not match closely enough waits in the Book Dock for someone to look at.", "verifyOffHint": "Nothing is held for review. Every download is filed as soon as its title and author have been read, so a mislabelled release lands in your library without warning.", "verificationEnabled": "Import checking is on", "verificationDisabled": "Import checking is off. Downloads will be filed without review", "verification": "Verification threshold", "verificationHint": "How closely a downloaded file has to match the request before it is filed on its own. Anything below this waits in the Book Dock for review instead. This applies to every request, including releases someone picked by hand.", "destinations": "Default destinations", "destinationsHint": "Where a book is filed when nobody chose a library for it. There is one default per medium, because the medium is picked before anything is searched and is the only thing known about the file that early. A destination the requester pinned, or one chosen at approval, is used ahead of these.", "destinationUnset": "No default", "destinationHiddenLibrary": "A library you cannot see", "destinationHiddenFolder": "A folder you cannot see", "selectFolder": "Choose a folder", "destinationLibraryFor": "Default library for {medium} requests", "destinationFolderFor": "Default folder for {medium} requests", "destinationClearFor": "Clear the default destination for {medium} requests", "importFormats": "Import formats", "importFormatsHint": "What to keep when one release carries the same book in more than one format, such as an EPUB and a PDF together. This never applies to a multipart audiobook, because its parts are one book rather than competing editions.", "importFormatsOption": { "all": "All available", "allHint": "Keep every format that came with the release.", "preferred": "Preferred only", "preferredHint": "Keep only the format that sits highest in the destination library's format priority." } }, "profiles": { "title": "Release profiles", "effectiveRule": "Auto-download rule: first matching tier, then highest score (minimum {score}).", "summary": "Releases outside the profile remain available for manual selection. With no tiers, releases rank by score alone.", "howProfiles": "How release profiles work", "hint": "A release is matched against tiers from top to bottom and takes the first tier it fits. Automatic downloads consider only tiered releases when a profile exists. Manual selection still includes untiered releases after the tiered results.", "bitrateNote": "A bitrate floor turns away a release that states a lower one. Most sources measure very few of their releases, and an unmeasured release is not turned away, so this narrows less than it looks.", "empty": "No profile. Releases for this medium are ranked by score alone.", "addTier": "Add tier", "removeTier": "Remove this tier", "moveUp": "Move this tier up", "moveDown": "Move this tier down", "tierName": "Tier name", "newTier": "Tier {position}", "formats": "Formats", "files": "Files", "anyLayout": "Any", "minBitrate": "Min kbps", "minSeeders": "Min seeders", "torrentConditions": "Torrent conditions", "nonTorrentConditions": "Seeder, freeleech and VIP conditions do not apply to the selected sources.", "incompatibleTorrentConditions": "This non-torrent tier still has saved torrent conditions. They may be ignored or prevent the tier from matching.", "removeTorrentConditions": "Remove torrent conditions", "channels": "Channels", "anyChannels": "Any", "mono": "Mono", "stereo": "Stereo", "maxSize": "Max MB", "languages": "Languages", "indexers": "Sources", "multiSelectHint": "Choose one or more, or leave it empty to allow any", "multiSelectAny": "Any" }, "health": { "ok": "Connected", "failed": "Not reachable", "untested": "Never tested", "disabled": "Disabled", "testedAt": "tested {time}", "failedAt": "failed {time}" }, "categoryLabel": "category {category}", "priorityLabel": "priority {priority}", "editClientName": "Edit {name}", "sections": { "connection": "Connection", "search": "What to search", "access": "Access", "seeding": "Seeding", "availability": "Availability", "behaviour": "Behaviour" }, "continueWithType": "Continue", "external": "External", "editorDescription": "Settings for this download client.", "chooseClientType": "Choose a client type", "chooseClientTypeHint": "Pick which program BookOrbit hands downloads to.", "clientTypeDescriptions": { "qbittorrent": "Your own qBittorrent. Needs an address and an account.", "transmission": "Your own Transmission. It has no categories, so the category becomes a subfolder of its download directory.", "deluge": "Your own Deluge. Sign in with the Web UI password; the category needs the Label plugin switched on.", "nzbget": "Your own NZBGet. BookOrbit sends NZB files over its JSON-RPC API.", "sabnzbd": "Your own SABnzbd. BookOrbit sends NZB files using its API key." }, "searchHealth": { "failingOnce": "Last search failed", "failingStreak": "{count} searches failed in a row", "lastSearchAt": "last searched {time}" } } }, "nav": { "title": "Settings", "ariaLabel": "Settings sections", "breadcrumbLabel": "Breadcrumb", "searchPlaceholder": "Search settings", "clearSearch": "Clear search", "noResults": "No settings match {query}.", "shortcutHint": "Press {shortcut} to jump to any setting", "status": { "scanning": "Scanning" }, "groups": { "you": "You", "library": "Library", "devices": "Devices", "accounts": "Accounts", "server": "Server" }, "descriptions": { "profile": "Your name, email, password, and active sessions.", "appearanceTheme": "Theme, accent colour, background, and corner radius.", "appearanceBookCovers": "Cover shadows, spine effects, and placeholder art.", "appearanceIcons": "Choose the icon style used across the app.", "appearanceLayout": "Default library view, density, and spacing.", "appearanceBehavior": "How the library reacts as you browse and sort.", "appearanceLanguage": "Interface language and regional formats.", "readerEbook": "Fonts, spacing, and page behaviour for eBooks.", "readerPdf": "Rendering, zoom, and page fit for PDFs.", "readerComics": "Reading direction and page spreads for comics.", "readerAudio": "Playback speed, skip intervals, and sleep timer.", "readerFonts": "Fonts available while reading.", "readerGeneral": "Defaults shared by every reading mode.", "notifications": "What BookOrbit tells you about, and where.", "privacy": "Reading insights, shared links, and activity visibility.", "restrictions": "Age ratings and hidden content for this account.", "libraries": "Scan paths, watched folders, and ingest rules.", "fileNaming": "Folder and filename patterns for stored files.", "maintenance": "Rescans, duplicates, orphans, and cache rebuilds.", "kobo": "Sync endpoint, store proxy, and shelf mapping.", "koreader": "Progress sync and document matching.", "opds": "Catalog feeds for third-party reading apps.", "email": "SMTP delivery and send-to-device addresses.", "hardcover": "Sync reading status and reviews with Hardcover.", "users": "Accounts, roles, permissions, and invitations.", "accountActivity": "Per-user reading and session activity.", "magicLinks": "Passwordless share and login links.", "oidc": "Single sign-on provider, claims, and provisioning.", "serverFonts": "Fonts installed for every reader on this server.", "bookDock": "Quick actions shown on book pages.", "auditLog": "Who changed what, and when.", "requests": "Sources, download clients, and what happens to a book once it downloads.", "readerTts": "Read-aloud voice, speed, and narration defaults.", "adminTts": "Text-to-speech engines available to every reader on this server." }, "backToApp": "Back to library", "pageDescriptions": { "profile": "Your name, photo, timezone and achievement tracking, plus your password and the sign-in providers linked to this account.", "appearance-theme": "Choose where your appearance settings are saved, then set the style, colour scheme, accent, corners, surface brightness and the pattern behind your library.", "appearance-book-covers": "How covers look across the app: placeholder art for books without one, how covers fit their slots, spine and gloss effects, and the cover tint on book pages.", "appearance-icons": "Upload your own icons to use alongside the built-in set for libraries, smart scopes and collections.", "appearance-layout": "Cover sizes and spacing for the library grid, the cover shown for a collapsed series, and how the author grid is laid out.", "appearance-behavior": "What opening a book from a grid or list does, whether series collapse into one card, and whether Book Requests appear in this account.", "appearance-language": "The language BookOrbit uses for menus, labels and messages, and the regional formats for dates and numbers.", "reader-ebook": "Defaults for the eBook reader: whether new books start with your settings, page flow and columns, theme, and typography such as font, size and spacing.", "reader-pdf": "How PDFs open: page by page or one continuous scroll, which page starts a two-page spread, and the default zoom fit.", "reader-comics": "How comics read: reading mode and direction, single or two-page spreads, fit, wide-page handling, and moving on to the next book in the series.", "reader-audio": "The starting speed and volume for new audiobooks, and how far the skip back and skip forward buttons jump.", "reader-fonts": "Upload your own fonts for the reader, and choose which fonts shared by your server administrator appear in it.", "reader-general": "Where your reader preferences are saved, and the defaults shared by every reading mode.", "tts": "Your default voice and speed when BookOrbit reads a book aloud.", "notifications": "Choose which events notify you, from finished scans and metadata fetches to file renames, imports and Book Dock results.", "privacy": "Decide how much of your reading activity administrators can see, preview your shared profile, and check who has viewed it.", "restrictions": "Content limits set on this account, such as age ratings and hidden content, and what they keep out of your libraries.", "libraries": "Every library at a glance: its folders, what it holds, how it is scanned and when it last ran. Add, edit or rescan libraries here.", "metadata-providers": "Turn metadata sources on or off, add API keys or cookies where a source needs them, and test the credentials against the live service.", "metadata-field-rules": "Choose which providers fill each metadata field and in what order, how values are merged, and how genres and provider IDs are collected.", "metadata-custom-fields": "Create your own metadata fields, choose their type and the libraries that use them, and reorder or archive them.", "metadata-score": "Decide how much each metadata field counts towards the completeness score shown on every book.", "metadata-auto-fetch": "Fetch book metadata automatically when books are imported or are missing details, with overrides for each library.", "metadata-authors": "Fetch author biographies and photos automatically, choose the order sources are tried, and decide which authors qualify.", "metadata-search-cache": "Keep provider answers so repeat searches are fast and still work when a provider is down, and control how long and how much is kept.", "metadata-genre-blocklist": "Genre values listed here are stripped from provider results before metadata is written, so labels like Audiobook stay out of your books.", "metadata-reminders": "Choose which missing fields show up in book reminders. This changes the reminders only, not metadata scores.", "file-naming": "Folder and file name patterns used when BookOrbit renames books on disk, with a preview of the result and what happens when a value is missing.", "maintenance": "Server housekeeping: the upload size limit, past imports, rebuilding recommendations, backfilling achievements and checking for updates.", "kobo": "Connect Kobo e-readers, choose how books, shelves and reading progress sync, and follow each device's recent sync activity.", "koreader": "Sync progress, reading activity and highlights with KOReader, get the sync URL and plugin, and manage the devices that connect.", "opds": "Turn on the OPDS catalog and create accounts so third-party reading apps can browse and download your books.", "email": "Manage the addresses books are sent to, such as Kindle inboxes, star the default one, and group recipients to send to several at once.", "hardcover": "Connect your Hardcover account and choose when reading status, progress and ratings sync, and how synced books appear there.", "readwise": "Connect your Readwise account to send your highlights there automatically.", "storygraph": "Connect your StoryGraph account using your browser session cookies to sync reading progress and status.", "users": "Create and manage accounts, their roles, permissions and library access, and see which accounts need attention.", "account-activity": "See when each account was last active and how it signs in, and open per-user reading and session insights.", "magic-links": "Create shareable links that sign someone in without a password, and revoke them when they are no longer needed.", "oidc": "Connect a single sign-on provider such as Keycloak, map its claims, and decide how new accounts are created.", "requests": "Where BookOrbit searches for requested books, which download clients fetch them, and what happens once a download finishes.", "admin-tts": "The text-to-speech engines readers can use for read-aloud, the voices offered from each, and the order they appear in.", "book-dock": "The Book Dock drop folder, automatic metadata fetching for new files, and the score at which files are finalized on their own.", "server-fonts": "Upload fonts once for every reader on this server. Each reader can still hide any of them.", "audit-log": "A searchable record of who changed what and when, filterable by event, person, affected item and date." } }, "field": { "required": "(required)" }, "editor": { "discardTitle": "Discard your changes?", "discardDescription": "This editor has changes that were never saved. Closing it now throws them away.", "discardConfirm": "Discard changes", "moreActions": "More actions", "removeQuestion": "Remove this?" } }, "achievements": { "title": "Achievements", "tiersCount": "{earned} / {total} tiers", "loadFailed": "Failed to load achievements", "tryAgain": "Try again", "noMatchFilter": "No achievements match this filter", "secretAchievement": "Secret Achievement", "earnedOn": "Earned {date}", "whileReading": "While reading “{title}”", "tierProgress": "Tier {earned} of {total}", "progressToNext": "{current} / {threshold} to {name}", "rarity": { "common": "Common", "rare": "Rare", "epic": "Epic", "legendary": "Legendary" }, "filter": { "all": "All", "earned": "Earned ({count})", "inProgress": "In Progress ({count})", "locked": "Locked ({count})" }, "tiersEarnedFact": "{earned} of {total} tiers", "loading": "Loading achievements", "filters": { "label": "Filter achievements", "all": "All", "earned": "Earned", "inProgress": "In progress", "locked": "Locked" }, "showcase": { "label": "Highlights", "latest": "Latest unlock", "newToday": "{count, plural, one {# new today} other {# new today}}", "secretRevealed": "Secret revealed", "categoryAndDate": "{category} · {date}", "alsoNew": "Also new", "openMedal": "Open {name}", "emptyTitle": "Your first medal is waiting", "emptyBody": "Finish a book, rate one or highlight a passage, and it lands here.", "collection": "Collection", "shareOfTiers": "{percent} of every tier", "tiersEarned": "{earned} of {total} tiers earned", "closest": "Closest to unlocking", "allInProgress": "All {count}", "tierOfSet": "Tier {tier} of {set}", "nothingCounting": "Nothing is counting toward a medal yet." }, "shelf": { "tiers": "{earned} / {total}", "progressLabel": "{category} tiers earned" }, "medal": { "label": "{name}, {rarity}, {status}", "tier": "Tier {tier}", "allTiers": "{count, plural, one {The only tier} other {All # tiers}}", "keepReading": "Keep reading", "notStarted": "Not started" }, "progress": { "generic": "{current} / {threshold}", "toGo": "{count, plural, one {# to go} other {# to go}}" }, "hints": { "howToGetIt": "How to get it", "readingPace": "{count, plural, one {You read # hour in the last {days} days.} other {You read # hours in the last {days} days.}}", "etaDays": "{count, plural, one {About # day at this pace.} other {About # days at this pace.}}", "etaWeeks": "{count, plural, one {About # week at this pace.} other {About # weeks at this pace.}}", "etaMonths": "{count, plural, one {About # month at this pace.} other {About # months at this pace.}}", "decadeUnread": "{count, plural, one {# book from the {decade}s is waiting on your shelves.} other {# books from the {decade}s are waiting on your shelves.}}", "centuryUnread": "{count, plural, one {# book from the {century}s is waiting on your shelves.} other {# books from the {century}s are waiting on your shelves.}}", "stalled": "{title} is {percent} read and was started on {date}.", "stalledNoProgress": "{title} was started on {date}.", "untitledBook": "A book in progress", "nearlyFinished": "{count, plural, one {# book in progress is past {percent}.} other {# books in progress are past {percent}.}}", "unratedFinished": "{count, plural, one {# book you finished has no rating yet.} other {# books you finished have no rating yet.}}", "shortBooks": "{count, plural, one {# book under {pages} pages is waiting on your shelves.} other {# books under {pages} pages are waiting on your shelves.}}", "alreadyStarted": "{count, plural, one {# is already in progress.} other {# are already in progress.}}", "longBooks": "{count, plural, one {# book of {pages} pages or more is waiting on your shelves.} other {# books of {pages} pages or more are waiting on your shelves.}}", "oldBooks": "{count, plural, one {# book published before {year} is waiting on your shelves.} other {# books published before {year} are waiting on your shelves.}}", "authorUnread": "{author}: {finished, plural, one {# finished} other {# finished}}, {count, plural, one {# more on your shelves} other {# more on your shelves}}.", "languageUnread": "{count, plural, one {# book in {language} is waiting on your shelves.} other {# books in {language} are waiting on your shelves.}}", "monthsRead": "{count, plural, one {You have read in # month of {year} so far.} other {You have read in # months of {year} so far.}}", "monthsLeft": "{count, plural, one {{months} is left.} other {{months} are left.}}", "noLongBook": "No book on your shelves has {pages} pages or more yet.", "nothingBeforeYear": "Nothing on your shelves was published before {year}.", "tooFewDecades": "{count, plural, one {Your shelves span only # decade so far.} other {Your shelves span only # decades so far.}}", "tooFewCenturies": "{count, plural, one {Your shelves span only # century so far.} other {Your shelves span only # centuries so far.}}", "missedMonth": "You did not read in {month}, so {year} is out of reach. The count starts again in January.", "continueReading": "Continue reading", "rateFinished": "Rate a finished book", "viewAuthor": "View author", "openBook": "Open {title}", "openUntitledBook": "Open book" }, "sets": { "booksFinished": "Books finished", "pagesRead": "Pages read", "hoursRead": "Hours read", "longestBook": "Longest book finished", "librarySize": "Library size", "annotations": "Annotations", "booksRated": "Books rated", "genresFinished": "Genres finished", "languagesFinished": "Languages finished", "readingStreak": "Reading streak" }, "units": { "books": { "progress": "{current} / {threshold} books", "toGo": "{count, plural, one {# book to go} other {# books to go}}" }, "pages": { "progress": "{current} / {threshold} pages", "toGo": "{count, plural, one {# page to go} other {# pages to go}}" }, "hours": { "progress": "{current} / {threshold} hours", "toGo": "{count, plural, one {# hour to go} other {# hours to go}}" }, "annotations": { "progress": "{current} / {threshold} annotations", "toGo": "{count, plural, one {# annotation to go} other {# annotations to go}}" }, "ratings": { "progress": "{current} / {threshold} ratings", "toGo": "{count, plural, one {# rating to go} other {# ratings to go}}" }, "genres": { "progress": "{current} / {threshold} genres", "toGo": "{count, plural, one {# genre to go} other {# genres to go}}" }, "languages": { "progress": "{current} / {threshold} languages", "toGo": "{count, plural, one {# language to go} other {# languages to go}}" }, "days": { "progress": "{current} / {threshold} days", "toGo": "{count, plural, one {# day to go} other {# days to go}}" } }, "moments": { "nthBook": "Book {number} was {title}", "pagesAtUnlock": "{count, plural, one {# page} other {# pages}} when it unlocked", "hoursAtUnlock": "{count, plural, one {# hour} other {# hours}} when it unlocked", "titleWithPages": "{title}, {count, plural, one {# page} other {# pages}}", "booksAtUnlock": "{count, plural, one {# book} other {# books}} in your library when it unlocked", "annotationsAtUnlock": "{count, plural, one {# annotation} other {# annotations}} when it unlocked", "ratingsAtUnlock": "{count, plural, one {# rating} other {# ratings}} when it unlocked", "genresAtUnlock": "{count, plural, one {# genre} other {# genres}} when it unlocked", "languagesAtUnlock": "{count, plural, one {# language} other {# languages}} when it unlocked", "streakAtUnlock": "{count, plural, one {# day} other {# days}} in a row at the time", "longSession": "One session ran {duration}", "durationHours": "{hours} h {minutes} min", "durationMinutes": "{minutes} min", "sessionStartedAt": "A session that started at {time}", "oneDayBook": "{title}, start to finish in one day", "booksInWeek": "{count, plural, one {# book} other {# books}} finished in one week", "booksInMonth": "{count, plural, one {# book} other {# books}} finished in {month}", "booksInYear": "{count, plural, one {# book} other {# books}} finished in {year}", "wholeBookOneSession": "A whole book in one session", "pagesInSession": "{count, plural, one {# page} other {# pages}} in one session", "pagesInDay": "{count, plural, one {# page} other {# pages}} in one day", "slowBurn": "{title}, finished after {count, plural, one {# day} other {# days}}", "formatsOwned": "{count, plural, one {# format} other {# formats}} on your shelves", "annotationsWithNote": "{count, plural, one {# annotation} other {# annotations}} with a note", "annotationsInDay": "{count, plural, one {# annotation} other {# annotations}} in one day", "everyStar": "Every rating from one star to five", "everyColour": "Every highlight colour used", "titlePublished": "{title}, published {year}", "booksInGenre": "{count, plural, one {# book} other {# books}} in one genre", "firstInSeries": "{title}, from the {series} series", "centuries": "Books from {count, plural, one {# century} other {# centuries}}", "booksBySameAuthor": "{count, plural, one {# book} other {# books}} by one author", "decades": "Books from {count, plural, one {# decade} other {# decades}}", "shortBooks": "{count, plural, one {# short book} other {# short books}} finished", "allSeasons": "All four seasons of {year}", "consistentDays": "{count, plural, one {# day} other {# days}} of 30 minutes or more", "weekendsInRow": "{count, plural, one {# weekend} other {# weekends}} in a row", "weekendHours": "{count, plural, one {# hour} other {# hours}} over the weekend of {date}", "categoriesCovered": "{count, plural, one {# category} other {# categories}} with an achievement", "readingSources": "{count, plural, one {# reading source} other {# reading sources}}", "oneBookSources": "One book read from {count, plural, one {# source} other {# sources}}" }, "records": { "title": "Record book", "subtitle": "The numbers behind your medals, as they stood when each unlocked", "value": "{value}", "oneSession": "One reading session", "pagesInSession": "Pages in one session", "pagesInDay": "Pages in one day", "booksInWeek": "Books in one week", "booksInMonth": "Books in {month}", "booksInYear": "Books finished in {year}", "annotations": "Annotations", "genresFinished": "Genres finished", "daysInRow": "Days in a row", "booksInLibrary": "Books in your library" }, "detail": { "categoryTierSet": "{category} · Tier set", "secretHint": "Keep reading to reveal this one.", "tierOf": "Tier {earned} of {total}", "current": "Current", "noneYet": "None yet", "progress": "Progress", "allTiersEarned": "Every tier earned", "tiers": "Tiers", "earned": "Earned", "status": "Status", "hidden": "Hidden", "rarity": "Rarity", "category": "Category", "theSet": "The set", "theMoment": "The moment" } }, "adminFeature": { "accountActivity": { "title": "Account Activity", "subtitle": "Review account authentication activity without exposing reading history.", "privacyNotice": "This page reports sign-ins and authentication refreshes only. It does not use reading history, book progress, or library activity.", "privacyLabel": "About account activity privacy", "never": "Never", "openInsightsFor": "Open shared reading insights for {name}", "permissionLabel": "View user activity", "states": { "recent": "Recently active", "dormant": "Dormant", "never": "No recorded activity", "disabled": "Disabled" }, "filters": { "search": "Search accounts", "searchPlaceholder": "Search name or username", "state": "Activity state", "allStates": "All activity states", "provisioning": "Authentication method", "allMethods": "All authentication methods", "sort": "Sort accounts", "mostRecent": "Most recently active", "leastRecent": "Least recently active", "lastLogin": "Most recent login", "newest": "Newest accounts", "oldest": "Oldest accounts", "name": "Name", "apply": "Apply", "clear": "Clear" }, "methods": { "local": "Local", "manual": "Administrator-created", "oidc": "OIDC / SSO", "shared": "Shared magic link" }, "columns": { "user": "User", "state": "Account state", "lastLogin": "Last login", "lastAuthenticated": "Last authenticated", "created": "Created", "readingInsights": "Reading insights" }, "sharing": { "private": "Not shared", "summary": "Summary shared", "detailed": "Detailed shared" }, "empty": { "title": "No accounts found", "description": "Try changing or clearing the current filters." }, "pagination": { "label": "Account activity pages", "page": "Page {page} of {totalPages}" }, "errors": { "load": "Failed to load account activity." } }, "sharedInsights": { "title": "Shared reading insights", "subtitle": "Reading information this user voluntarily chose to share.", "auditNotice": "Access to this profile is recorded and visible to the user.", "period": "Reporting period", "periodDays": "Last {count} days", "durationMinutes": "{count, plural, one {# minute} other {# minutes}}", "durationHours": "{count, plural, one {# hour} other {# hours}}", "metrics": { "sessions": "Sessions", "readingTime": "Reading time", "activeDays": "Active days", "started": "Books started", "completed": "Books completed" }, "trend": "Daily reading trend", "emptyTitle": "No reading activity in this period", "noData": "No recorded reading data for this period.", "sessionCount": "{count, plural, one {# session} other {# sessions}}", "sourceNames": { "web": "Web reader", "ios": "iOS app", "watchos": "Apple Watch", "android": "Android app", "koreader": "KOReader", "manual": "Manual", "kobo": "Kobo", "unknown": "Unknown" }, "formats": "Formats", "genres": "Genres", "broadGenres": { "science_fiction": "Science fiction", "fantasy": "Fantasy", "mystery_thriller": "Mystery & thriller", "romance": "Romance", "horror": "Horror", "history_biography": "History & biography", "science_technology": "Science & technology", "business_economics": "Business & economics", "self_development": "Self-development", "society_culture": "Society & culture", "children_young_adult": "Children & young adult", "comics_graphic_novels": "Comics & graphic novels", "poetry": "Poetry", "other": "Other" }, "sources": "Data sources", "topBooks": "Most-read books", "recentBooks": "Recently read", "unknownTitle": "Untitled book", "top": { "authors": "Top authors", "genres": "Top genres", "series": "Top series", "narrators": "Top narrators" }, "errors": { "READING_INSIGHTS_PRIVATE": "This user is not sharing reading insights.", "READING_INSIGHTS_SUMMARY_ONLY": "This user shares summary insights only.", "READING_INSIGHTS_VIEW_SESSION_REQUIRED": "A profile view session is required.", "READING_INSIGHTS_VIEW_SESSION_INVALID": "This profile view expired or is no longer valid.", "LOAD_FAILED": "Shared reading insights could not be loaded.", "cleared": "No previously loaded profile information is being displayed." } }, "resetLink": { "title": "Password Reset Link", "description": "Share this link with the user. It expires in 15 minutes.", "copy": "Copy", "copied": "Copied!", "copyFailed": "Copy failed", "notShownAgain": "This link will not be shown again." }, "userForm": { "editUser": "Edit User", "createUser": "Create User", "createSharedAccount": "Create Shared Account", "sharedBadge": "Shared", "active": "Active", "suspended": "Suspended", "tabs": { "general": "general", "access": "access", "restrictions": "restrictions" }, "sharedAccount": "Shared account", "sharedAccountHint": "No password. Access is granted via magic links only.", "sharedAccountManageHint": "Manage login links from Settings - Magic Links.", "username": "Username", "fullName": "Full name", "email": "Email", "optional": "(optional)", "libraryAccess": "Library Access", "noLibrariesSelected": "No libraries selected. User cannot view any books.", "permissions": "Permissions", "presetStandard": "Standard", "presetAdmin": "Admin", "presetClearAll": "Clear All", "permissionGroups": { "content": "Content", "devicesAccess": "Devices & Access", "email": "Email", "administration": "Administration", "notifications": "Notifications", "restrictions": "Restrictions", "libraryBooks": "Library & Books", "bookRequests": "Book Requests", "bookDock": "Book Dock", "devices": "Devices", "readingIntegrations": "Reading Integrations", "emailNotifications": "Email & Notifications", "libraryConfiguration": "Library Configuration", "usersSecurity": "Users & Security", "system": "System" }, "permissionLevels": { "use": "Use", "manage": "Manage" }, "accountRestrictions": "Account Restrictions", "demoRestrictedHint": "Limits this account to the restricted demo experience.", "superuserTarget": "Superuser Target", "superuserTargetHint": "Content restrictions cannot be applied to superusers.", "superuserAccess": { "title": "Superuser access", "enabled": "Enabled", "disabled": "Disabled", "enabledHint": "This account has unrestricted server access. Its saved permissions, libraries, and restrictions will apply again after demotion.", "disabledHint": "Promotion grants unrestricted server access and bypasses permissions, library assignments, and content restrictions.", "selfHint": "You cannot change your own superuser access.", "sharedHint": "Shared accounts cannot be promoted to superuser.", "promote": "Promote to superuser", "demote": "Remove superuser access", "promoteDialogTitle": "Promote to superuser?", "promoteDialogBody": "Grant {name} unrestricted server access. Their active sessions will end, and they must sign in again.", "demoteDialogTitle": "Remove superuser access?", "demoteDialogBody": "Remove unrestricted access from {name}. Their saved permissions, libraries, and restrictions will take effect, and they must sign in again.", "changing": "Updating access...", "changeError": "Failed to update superuser access. Reload the account and try again." }, "noRestrictions": "No content restrictions", "noRestrictionsHint": "This user has full access to all books in their assigned libraries.", "addRestrictions": "+ Add Content Restrictions", "contentRestrictions": "Content Restrictions", "remove": "Remove", "includeTags": "Include tags", "includeTagsHint": "(show only books with these tags)", "excludeTags": "Exclude tags", "excludeTagsHint": "(hide books with these tags)", "includeGenres": "Include genres", "includeGenresHint": "(show only books with these genres)", "excludeGenres": "Exclude genres", "excludeGenresHint": "(hide books with these genres)", "seeOwnRequestedBooks": "Let this user see books they requested", "seeOwnRequestedBooksHint": "Books that arrived through their own book requests ignore the rules above. Off by default.", "searchTagsPlaceholder": "Search tags...", "searchGenresPlaceholder": "Search genres...", "saving": "Saving...", "errors": { "updateUser": "Failed to update user", "updatePermissions": "Failed to update permissions", "updateLibraryAccess": "Failed to update library access", "updateContentFilters": "Failed to update content filters", "emailRequired": "Email is required", "createSharedAccount": "Failed to create shared account", "createUser": "Failed to create user", "nameRequired": "Full name is required", "usernameRequired": "Username is required" }, "drawerDescription": "Edit this account's profile, library access, permissions and restrictions.", "createHint": "New accounts hold no permissions until you grant them.", "sectionsLabel": "Account settings", "sections": { "profile": "Profile", "libraries": "Libraries", "permissions": "Permissions", "restrictions": "Restrictions" }, "sectionSummary": { "newAccount": "Not created yet", "libraries": "{selected} of {total}", "permissions": "{count, plural, =0 {No permissions} one {1 granted} other {# granted}}", "restrictionsNone": "None", "restrictionsContent": "Content filters", "restrictionsDemo": "Demo restricted", "restrictionsBoth": "Filters and demo mode" }, "account": "Account", "status": "Status", "statusHint": "Suspended users cannot sign in or sync devices.", "signInMethod": "Sign-in", "signInMethods": { "password": "Password", "oidc": "Single sign-on", "shared": "Magic link" }, "created": "Created", "lockedUntil": "Locked until {time}", "lockedHint": "Too many failed sign-in attempts. Unlock from the users list.", "usernameFixedHint": "Usernames cannot be changed.", "emailHint": "Used for password resets and notifications.", "libraryAccessHint": "Books outside these libraries are invisible to this user.", "selectAll": "Select all", "clearAll": "Clear", "permissionsHint": "What this account is allowed to do. {granted} of {total} granted.", "groupLegend": "{group}: {granted} of {total} granted", "permissionNotes": { "editMetadataNowhere": "No effect yet: it also needs the Editor or Owner role on a library, set in Settings > Libraries > Access.", "editMetadataExcept": "Not in {libraries}, where this account is a Viewer. Set Editor or Owner in Settings > Libraries > Access." }, "presets": { "label": "Permission preset", "none": "None", "standard": "Standard", "custom": "Custom", "admin": "Admin", "customHint": "This selection does not match a preset." }, "filterPermissions": "Filter permissions", "grantedOnly": "Granted only", "noPermissionMatches": "No permissions match that filter.", "clearFilters": "Clear filters", "filteredNotice": "Filtered. Permissions that are hidden keep their current setting.", "contentRestrictionsHint": "Limit which books this user can see, by tag or genre.", "contentRestrictionsAfterCreate": "Content restrictions can be set once the account exists.", "unsavedChanges": "{count, plural, one {1 unsaved change} other {# unsaved changes}}", "libraryBookCount": "{count, plural, =0 {No books} one {1 book} other {# books}}", "dangerZone": "Danger zone", "deleteUserHint": "Permanently removes this account and its reading data. Books in the library are not affected.", "libraryReach": "This account can see {selected} of {total} books." }, "usersPage": { "usersTitle": "Users", "usersSubtitle": "Manage user accounts and permission assignments.", "createUser": "Create user", "columns": { "name": "Name", "username": "Username", "email": "Email", "access": "Access", "status": "Status", "actions": "Actions", "user": "User", "libraries": "Libraries", "lastActive": "Last active" }, "adminBadge": "Admin", "permissionCount": "{count, plural, =0 {no permissions} one {one permission} other {# permissions}}", "filteredBadge": "Filtered", "contentRestrictionsActive": "Content restrictions active", "statusActive": "Active", "statusInactive": "Inactive", "lockedBadge": "Locked", "unlockAccount": "Unlock account", "unlockHint": "Clear the sign-in lockout", "unlockAria": "Unlock {name}", "resetPassword": "Reset password", "resetPasswordOidcHint": "OIDC users reset passwords in their identity provider", "resetPasswordSharedHint": "Shared accounts do not have passwords", "resetPasswordOidcHintFull": "OIDC users reset passwords in their identity provider.", "resetPasswordSharedHintFull": "Shared accounts do not have passwords.", "resetPasswordDisabledHintFull": "Password authentication is disabled by the server configuration.", "deleteUserAction": "Delete user", "deleteDialogTitle": "Delete user?", "deleteDialogBody": "Delete user \"{username}\". This action cannot be undone.", "deleting": "Deleting...", "errors": { "load": "Failed to load", "deleteUser": "Failed to delete user", "resetPassword": "Failed to create a password reset link", "unlock": "Failed to unlock the account" }, "selfRegistration": { "title": "Self-Registration", "subtitle": "Control whether visitors can create their own accounts.", "label": "Allow self-registration", "hint": "When enabled, the sign-in page shows a link to create an account.", "enabledNotice": "New accounts start with the default library access below and no other permissions. Grant permissions before they can use protected features.", "loadError": "Failed to load the self-registration setting", "saveError": "Failed to update the self-registration setting" }, "defaultLibraryAccess": { "title": "Default Library Access", "subtitle": "Viewer access granted to self-registered and OIDC-provisioned users.", "description": "Select the libraries assigned automatically to new users.", "noLibraries": "No libraries available.", "save": "Save defaults", "saving": "Saving...", "saveError": "Failed to save default library access" }, "filters": { "search": "Search users", "searchPlaceholder": "Search by name, username or email", "sort": "Sort users", "clear": "Clear", "state": "Filter users", "allUsers": "All users", "admins": "Administrators", "active": "Active", "inactive": "Inactive" }, "empty": { "title": "No users yet", "description": "Create the first account to get started.", "filtered": "No users match the current search and filters." }, "pagination": { "label": "Users pagination", "page": "Page {page} of {totalPages}", "showing": "Showing {shown} of {total} accounts" }, "editUserAria": "Edit {name}", "resetPasswordAria": "Reset the password for {name}", "deleteUserAria": "Delete {name}", "moreActionsAria": "More actions for {name}", "headerSummary": "{count, plural, =0 {No accounts} one {# account} other {# accounts}} · {admins} with administrator access", "noEmail": "No address", "editAccount": "Edit account", "cardMeta": "{access} · {libraries} · {lastActive}", "accessTier": { "superuser": "Superuser", "admin": "Admin", "standard": "Standard", "custom": "Custom", "none": "No access" }, "libraries": { "all": "All {total}", "some": "{granted} of {total}" }, "statusLocked": "Locked", "status": { "never": "Never", "neverSignedIn": "Never signed in", "defaultPassword": "Default password", "contentFiltered": "Content filtered", "unlocksIn": "Unlocks {when}" }, "attention": { "title": "Needs attention", "count": "{count, plural, one {# account} other {# accounts}}", "filter": "{count, plural, one {# needs attention} other {# need attention}}", "more": "{count} more not shown here", "reason": { "locked": "{name} is locked out after too many failed sign-ins", "neverSignedIn": "{name} has never signed in", "defaultPassword": "{name} is still using the password the account was created with" }, "detail": { "unlocksIn": "Unlocks automatically {when}", "created": "Created {when}", "linkExpired": "Created {when} · the sign-in link has expired", "linkValid": "Created {when} · sign-in link valid until {expiry}" }, "action": { "unlock": "Unlock now", "sendResetLink": "Send reset link", "sendNewLink": "Send new link" }, "collapse": "Hide", "expand": "Show" }, "defaults": { "title": "Defaults for new accounts", "appliesTo": "Applies to self-registration and OIDC", "startingLibraries": "Starting libraries", "startingLibrariesHint": "Viewer access granted automatically to every new account." } } }, "annotations": { "unknownBook": "Unknown book", "styles": { "highlight": "Highlight", "underline": "Underline", "strike": "Strike", "squiggle": "Squiggle", "invert": "Invert" }, "combobox": { "filterByBook": "Filter by book", "allBooks": "All books", "clearBookFilter": "Clear book filter", "searching": "Searching...", "noBooksFound": "No books found" }, "bulk": { "countSelected": "{count, plural, one {# selected} other {# selected}}", "pageSelected": "Page selected", "selectPage": "Select page", "clear": "Clear", "recolorTo": "Recolor to {color}", "restyleTo": "Restyle to {style}" }, "chips": { "active": "Active:", "removeFilter": "Remove filter {label}", "clearAll": "Clear all" }, "filters": { "colors": "Colors", "dateRange": "Date range", "fromDate": "From date", "toDate": "To date", "to": "to", "clearDateRange": "Clear date range", "clearAll": "Clear all" }, "pagination": { "showing": "Showing {start}-{end} of {total}", "pageOf": "Page {page} of {totalPages}", "firstPage": "First page", "previousPage": "Previous page", "nextPage": "Next page", "lastPage": "Last page" }, "sync": { "loading": "Loading sync detail", "positions": "Positions", "devices": "Devices", "retryConversion": "Retry conversion", "noStoredPositions": "No stored positions.", "notSynced": "Not synced to any device yet.", "upToDate": "Up to date", "pendingVersion": "Pending v{version}", "syncedAt": "synced {date}", "format": { "webReader": "Web reader", "koreader": "KOReader", "pdf": "PDF", "kobo": "Kobo" }, "status": { "exact": "Exact", "repaired": "Repaired", "failed": "Failed", "pending": "Pending" } }, "toolbar": { "searchPlaceholder": "Search text and notes", "filters": "Filters", "sortOrder": "Sort order", "switchToCompact": "Switch to compact view", "switchToComfortable": "Switch to comfortable view", "compactView": "Compact view", "comfortableView": "Comfortable view" }, "listItem": { "pageNumber": "p. {page}", "chapterNumber": "chapter {chapter}", "selectAnnotation": "Select annotation", "collapse": "Collapse", "expand": "Expand", "hideSyncDetail": "Hide sync detail", "showSyncDetail": "Show sync detail", "exactPositionUnavailable": "Exact reader position unavailable", "saving": "Saving", "bookDetails": "Book details", "openInReader": "Open in reader", "restore": "Restore", "deleteForever": "Delete forever", "editNote": "Edit note", "addNote": "Add note", "colorAndStyle": "Color and style", "copied": "Copied", "copyText": "Copy text", "trash": "Trash", "moveToTrash": "Move to trash" }, "hub": { "title": "Annotations", "totalCount": "{count} total", "bookCount": "{count, plural, =0 {no books} one {# book} other {# books}}", "noteCount": "{count, plural, =0 {no notes} one {# note} other {# notes}}", "export": "Export", "exportMarkdown": "Markdown", "exportCsv": "CSV", "exportJson": "JSON", "notesOnly": "Notes only", "style": "Style", "source": "Source", "bulkTrash": "Trash", "bulkRestore": "Restore", "tabs": { "highlights": "Highlights", "trash": "Trash" }, "empty": { "noMatch": "No highlights match your filters.", "resetFilters": "Reset filters", "trashEmpty": "Trash is empty", "noAnnotations": "No annotations yet. Highlights you create on the web or your e-reader appear here.", "noMatchHint": "Try a shorter phrase, or clear the colour and book filters.", "noAnnotationsBody": "Everything you mark, in any book and on any device, collects here.", "readHere": "Read here", "readHereBody": "Select text in the reader and pick a colour.", "syncKobo": "Sync a Kobo", "syncKoboBody": "Marks made on the device arrive on the next sync.", "syncKoreader": "Sync KOReader", "syncKoreaderBody": "The plugin uploads annotations with their positions.", "goToLibrary": "Go to the library" }, "toast": { "movedToTrash": "Moved to trash", "annotationRestored": "Annotation restored", "annotationDeletedForever": "Annotation deleted forever", "failedToDelete": "Failed to delete", "bulkTrashed": "{count, plural, =0 {Moved no annotations to trash} one {Moved # annotation to trash} other {Moved # annotations to trash}}", "bulkRestored": "{count, plural, =0 {Restored no annotations} one {Restored # annotation} other {Restored # annotations}}", "bulkRecolored": "{count, plural, =0 {Recolored no annotations} one {Recolored # annotation} other {Recolored # annotations}}", "bulkRestyled": "{count, plural, =0 {Restyled no annotations} one {Restyled # annotation} other {Restyled # annotations}}", "noteSaved": "Note saved", "purgePendingDeviceSync": "A synced device still has to remove this annotation. Sync that device, then delete it forever." }, "railTitle": "{marks} marks · {books} books", "lastTwelveMonths": "Last 12 months", "colour": "Colour", "whereFrom": "Where they came from", "theShelf": "The shelf", "devices": "Devices", "allBooks": "All {count} books", "behindCount": "{count, plural, one {# behind} other {# behind}}", "busiestWeek": "Busiest week", "longestQuiet": "Longest quiet stretch", "mostMarked": "Most marked", "weekCount": "{count, plural, one {# week} other {# weeks}}", "anchorsUnplaced": "{count, plural, one {# anchor could not be placed} other {# anchors could not be placed}}", "reviewThem": "Review them", "anchorLost": "Anchor lost", "anchorRepaired": "Repaired", "notes": "Notes", "review": "Review", "viewLabel": "Group and sort", "views": { "newest": "Newest first", "oldest": "Oldest first", "book": "By book", "color": "By colour", "source": "By source" }, "matchCount": "{shown} of {total}", "moreActions": "More actions", "loadMore": "{count, plural, one {Load 1 more} other {Load # more}}", "openBook": "Open book", "noteLabel": "Note", "yourNote": "Your note", "notePlaceholder": "Say why this mattered.", "openAtThisPage": "Open at this page", "positionAndSync": "Position & sync", "loadFailed": "Could not load your highlights. Try again in a moment.", "chips": { "dateBetween": "{from} to {to}", "dateFrom": "From {from}", "dateUntil": "Until {to}" }, "activitySummary": "{count, plural, one {# highlight between {from} and {to}} other {# highlights between {from} and {to}}}", "book": "Book", "needsReview": "Needs review", "trashToggle": "{count, plural, one {Trash, # annotation} other {Trash, # annotations}}", "purgeDialog": { "title": "Delete forever?", "description": "This annotation and its note are removed for good. It cannot be restored from the trash." } }, "sources": { "web": "Web", "bookorbit": "BookOrbit", "koreader": "KOReader", "kobo": "Kobo" }, "colors": { "yellow": "Yellow", "green": "Green", "blue": "Blue", "pink": "Pink", "orange": "Orange", "red": "Red", "olive": "Olive", "cyan": "Cyan", "purple": "Purple", "gray": "Gray" } }, "audit": { "pageTitle": "Audit Log", "pageSubtitle": "A record of admin-significant actions performed across the system.", "filters": "Filters", "noActiveFilters": "No active filters", "clear": "Clear", "empty": "No audit logs found", "showMore": "Show more", "showLess": "Show less", "details": "Details", "hideDetails": "Hide details", "refresh": "Refresh audit log", "loadError": "Could not load audit events.", "removeFilter": "Remove filter: {value}", "allActions": "All actions", "allEventTypes": "All event types", "allActors": "All actors", "noActionsFound": "No matching actions", "noActorsFound": "No matching actors", "noResourcesFound": "No matching target types", "unknownAction": "Unknown action", "unknownResource": "Other target type", "allResources": "All resources", "allTargetTypes": "All target types", "quickDates": "Quick dates", "today": "Today", "sevenDays": "7 days", "thirtyDays": "30 days", "userId": "User #{id}", "userIdCompact": "#{id}", "targetAdditional": "and {count, plural, one {# more target} other {# more targets}}", "bookImpact": "{count, plural, one {# book} other {# books}}", "entryDetailsLabel": "Details for audit event #{id}", "detailEventId": "Event ID", "detailOccurredAt": "Occurred", "detailActor": "Actor", "detailCategory": "Category", "detailActionLabel": "Action", "detailEventTypeLabel": "Event type", "detailIpLabel": "IP address", "detailResourceLabel": "Resource", "detailResourceIdLabel": "Resource ID", "detailTargetTypeLabel": "Target type", "detailTargetIdLabel": "Target ID", "detailAction": "Action: {value}", "detailIp": "IP: {value}", "detailResource": "Resource: {value}", "detailResourceId": "Resource ID: {value}", "deletedBooks": "Deleted books", "deletedBookDetail": "{title} (book #{id})", "untitledBook": "Untitled", "deletedBooksOmitted": "{count, plural, one {# additional book omitted} other {# additional books omitted}}", "showing": "Showing {from}-{to} of {total}", "prev": "Prev", "chips": { "search": "Search: {value}", "action": "Action: {value}", "eventType": "Event type: {value}", "actor": "Actor: {value}", "resource": "Resource: {value}", "targetType": "Target type: {value}", "user": "User: {value}", "from": "From: {value}", "to": "To: {value}" }, "filterLabels": { "search": "Search events", "action": "Action", "eventType": "Event type (what happened)", "actor": "Actor", "resource": "Resource", "targetType": "Target type (what was affected)", "userId": "User ID", "from": "From", "to": "To" }, "filterPlaceholders": { "search": "Description, actor, target, or ID", "actor": "Username", "action": "e.g. auth.login", "userId": "e.g. 1" }, "columns": { "when": "When", "actor": "Actor", "event": "Event", "target": "Target", "impact": "Impact", "user": "User", "action": "Action", "description": "Description", "ip": "IP", "time": "Time", "person": "Person", "source": "Source", "open": "Open", "network": "Network", "activity": "Activity" }, "categories": { "authentication": "Authentication", "books": "Books", "users": "Users", "libraries": "Libraries", "collections": "Collections", "integrations": "Integrations", "settings": "Settings", "other": "Other", "access": "Sign-in & access", "requests": "Requests", "devices": "Devices & email" }, "resourceLabels": { "User": "User", "Library": "Library", "Book": "Book", "Collection": "Collection", "SmartScope": "Smart scope", "BookDockFile": "Book Dock file", "BookRequest": "Book request", "DownloadClient": "Download client", "RequestIndexer": "Indexer", "MetadataHttpProvider": "Metadata provider", "Author": "Author", "AppSettings": "Application settings", "Genre": "Genre", "Tag": "Tag", "KoboDevice": "Kobo device", "EmailProvider": "Email provider", "EmailTemplate": "Email template", "EmailRecipient": "Email recipient", "EmailRecipientGroup": "Email recipient group", "Narrator": "Narrator", "Publisher": "Publisher", "Language": "Language", "Series": "Series", "OidcIdentity": "OIDC identity", "MagicLinkToken": "Magic link", "ReadingInsightsProfile": "Reading insights profile" }, "actionLabels": { "AuthRegister": "Register account", "AuthLogin": "Sign in", "AuthLoginFailed": "Failed sign-in", "AuthLogout": "Sign out", "AuthPasswordChange": "Change password", "AuthPasswordResetRequest": "Request password reset", "AuthPasswordReset": "Reset password", "AuthPasswordAdminReset": "Reset user password", "AuthSessionRevoke": "Revoke session", "MagicLinkCreate": "Create magic link", "MagicLinkLogin": "Sign in with magic link", "MagicLinkRevoke": "Revoke magic link", "MagicLinkActivate": "Activate magic link", "MagicLinkDeactivate": "Deactivate magic link", "OidcLogin": "Sign in with OIDC", "OidcUserProvisioned": "Provision OIDC user", "OidcIdentityLinked": "Link OIDC identity", "OidcIdentityUnlinked": "Unlink OIDC identity", "UserCreate": "Create user", "UserUpdate": "Update user", "UserSelfUpdate": "Update own profile", "UserDelete": "Delete user", "UserPermissionSet": "Update user permissions", "UserSuperuserEnable": "Enable superuser access", "UserSuperuserDisable": "Disable superuser access", "UserContentFiltersSet": "Update content filters", "UserUnlock": "Unlock account", "ReadingInsightsSharingUpdate": "Update insight sharing", "ReadingInsightsProfileView": "View shared insights", "LibraryCreate": "Create library", "LibraryUpdate": "Update library", "LibraryDelete": "Delete library", "LibraryFolderAdd": "Add library folder", "LibraryFolderRemove": "Remove library folder", "LibraryAccessGrant": "Grant library access", "LibraryAccessUpdate": "Update library access", "LibraryAccessRevoke": "Revoke library access", "LibraryWriteMetadataToFiles": "Write metadata to files", "LibraryBulkRename": "Rename library files", "LibraryRecomputeAddedAt": "Recompute date added", "LibraryReapplyRegexMetadata": "Apply path rules to existing books", "BookUpload": "Upload book", "BookMetadataUpdate": "Update book metadata", "BookMetadataLocksUpdate": "Update metadata locks", "BookDelete": "Delete book", "BookBulkMetadataRefresh": "Refresh book metadata", "BookBulkDelete": "Delete books", "BookBulkCoverReextract": "Re-extract book covers", "BookBulkSetStatus": "Set book status", "BookBulkSetRating": "Set book rating", "BookBulkSetMetadata": "Set book metadata", "BookBulkUpdateTags": "Update book tags", "BookBulkSetMetadataLock": "Set metadata locks", "BookBulkEditMetadata": "Edit book metadata", "BookBulkMoveLibrary": "Move books to another library", "BookReadingStateReset": "Reset reading state", "BookWriteAndRename": "Write metadata and rename file", "CollectionCreate": "Create collection", "CollectionUpdate": "Update collection", "CollectionDelete": "Delete collection", "CollectionBooksAdd": "Add books to collection", "CollectionBooksRemove": "Remove books from collection", "SmartScopeCreate": "Create smart scope", "SmartScopeUpdate": "Update smart scope", "SmartScopeDelete": "Delete smart scope", "BookDockFinalize": "Finalize Book Dock file", "BookRequestCreate": "Create book request", "BookRequestApprove": "Approve book request", "BookRequestReject": "Reject book request", "BookRequestCancel": "Cancel book request", "BookRequestFulfill": "Fulfil book request", "BookRequestGrab": "Send book request to a download client", "BookRequestImport": "Import a book request download", "BookRequestRemoveDownload": "Remove a book request download from its client", "BookRequestDelete": "Delete book request", "DownloadClientCreate": "Create download client", "DownloadClientUpdate": "Update download client", "DownloadClientDelete": "Delete download client", "RequestIndexerCreate": "Indexer added", "RequestIndexerUpdate": "Indexer updated", "RequestIndexerDelete": "Source deleted", "RequestIndexerPluginInspect": "Indexer plugin inspected", "RequestIndexerPluginInstall": "Indexer plugin installed", "RequestIndexerPluginRemove": "Indexer plugin deleted", "MetadataHttpProviderCreate": "Metadata provider added", "MetadataHttpProviderUpdate": "Metadata provider updated", "MetadataHttpProviderDelete": "Metadata provider removed", "AuthorUpdate": "Update author", "AuthorDelete": "Delete author", "AuthorMerge": "Merge authors", "AuthorEnrichmentConfigUpdate": "Update author enrichment", "AuthorEnrichmentPause": "Pause author enrichment", "AuthorEnrichmentResume": "Resume author enrichment", "AuthorEnrichmentCancel": "Cancel author enrichment", "EntityManagerMerge": "Merge entities", "EntityManagerRename": "Rename entity", "EntityManagerDelete": "Delete entity", "EntityManagerSplit": "Split entity", "EntityManagerDismiss": "Dismiss duplicate", "EntityManagerUndismiss": "Restore dismissed duplicate", "AppSettingsUpdate": "Update app settings", "KoboDeviceRegister": "Register Kobo device", "KoboDeviceRename": "Rename Kobo device", "KoboDeviceRemove": "Remove Kobo device", "EmailProviderCreate": "Create email provider", "EmailProviderUpdate": "Update email provider", "EmailProviderDelete": "Delete email provider", "EmailProviderSetDefault": "Set default email provider", "EmailProviderSetSystem": "Set system email provider", "EmailProviderClearSystem": "Clear system email provider", "EmailTemplateCreate": "Create email template", "EmailTemplateUpdate": "Update email template", "EmailTemplateDelete": "Delete email template", "EmailTemplateSetDefault": "Set default email template", "EmailRecipientCreate": "Create email recipient", "EmailRecipientUpdate": "Update email recipient", "EmailRecipientDelete": "Delete email recipient", "EmailRecipientGroupCreate": "Create recipient group", "EmailRecipientGroupUpdate": "Update recipient group", "EmailRecipientGroupDelete": "Delete recipient group", "EmailRecipientGroupMemberAdd": "Add recipient to group", "EmailRecipientGroupMemberRemove": "Remove recipient from group", "MaintenanceMissingBooksClean": "Cleaned missing books", "MaintenanceBrokenCoversClean": "Cleaned broken covers", "MaintenanceOrphanedCoversClean": "Cleaned orphaned cover folders" }, "views": { "label": "Show", "changes": "Changes", "signins": "Sign-ins", "security": "Security", "all": "All" }, "search": { "label": "Search events", "placeholder": "Search people, targets or IP addresses", "placeholderShort": "Search events" }, "range": { "label": "Date range: {range}", "today": "Today", "7d": "Last 7 days", "30d": "Last 30 days", "all": "Everything kept", "custom": "Custom range", "from": "From", "to": "To", "between": "{from} to {to}", "since": "Since {date}", "until": "Until {date}", "sinceOldest": "Since {date}" }, "filterMenu": { "button": "Filters", "category": "Category", "person": "Person", "findPerson": "Find a person", "noPeople": "No matching people", "clear": "Clear", "done": "Done" }, "activeFilters": { "target": "{type}: {name}", "clearAll": "Clear all" }, "securityGroups": { "label": "Security event type", "all": "Everything", "failed": "Failed sign-ins", "accounts": "Accounts", "passwords": "Passwords", "permissions": "Permissions", "access": "Library access", "links": "Sign-in links" }, "day": { "today": "Today", "yesterday": "Yesterday", "changes": "{count, plural, one {# change} other {# changes}}", "events": "{count, plural, one {# event} other {# events}}" }, "person": { "system": "System", "deleted": "Deleted account", "automation": "Automation" }, "source": { "server": "This server", "local": "Local network", "internet": "Internet", "job": "Background job", "unknown": "Not recorded" }, "target": { "none": "No target", "more": "+{count}", "sinceDeleted": "Since deleted", "withId": "{type} #{id}" }, "openEvent": "Open details: {event}", "signIns": { "signIns": "{count, plural, one {# sign-in} other {# sign-ins}}", "signOuts": "{count, plural, one {# sign-out} other {# sign-outs}}", "failed": "{count, plural, one {# failed attempt} other {# failed attempts}}", "failedAs": "{count, plural, one {# failed as {names}} other {# failed as {names}}}", "range": "{from} – {to}", "footer": "{count, plural, one {{events} sign-in events, folded into # row by person, day and network} other {{events} sign-in events, folded into # rows by person, day and network}}" }, "pager": { "label": "Pages", "previous": "Previous page", "next": "Next page", "page": "Page {page}", "changes": "{from}–{to} of {count, plural, one {# change} other {# changes}}", "events": "{from}–{to} of {count, plural, one {# event} other {# events}}" }, "drawer": { "description": "Details of one audit event", "close": "Close", "subtitle": "{category} · {day}, {time}", "when": "When", "person": "Person", "source": "Source", "target": "Target", "usernameTried": "Username tried", "deletedHere": "{type} · deleted by this event", "deletedSince": "{type} · since deleted", "inThisRow": "{count, plural, one {# event in this row} other {# events in this row}}", "around": "Around this event", "aroundHint": "{name}, 40 minutes either side", "aroundEmpty": "Nothing else from {name} within 40 minutes.", "history": "History", "historyCount": "{count, plural, one {# event} other {# events}}", "historyMeta": "{name} · {date}, {time}", "thisEvent": "This event", "raw": "Raw event", "rawEventId": "Event ID", "rawAction": "Action", "rawTarget": "Target type", "rawNote": "Server note", "only": "Only {name}" }, "facts": { "format": "Format", "size": "Size", "download": "Download", "dockFile": "Book Dock file", "rejected": "Rejected", "failed": "Failed", "cleaned": "Cleaned", "skipped": "Skipped", "remaining": "Remaining", "sharingLevel": "Sharing level", "sharing": { "private": "Not shared", "summary": "Summary", "detailed": "Detailed" } }, "retention": { "button": "{count, plural, one {Kept for # day} other {Kept for # days}}", "title": "Keep events for", "days": "{count, plural, one {# day} other {# days}}", "hint": "Older events are deleted every night at midnight.", "hintWithOldest": "Older events are deleted every night at midnight. The oldest event kept is from {date}.", "readOnly": "Only people who can change app settings can change this.", "saved": "{count, plural, one {Audit events are now kept for # day.} other {Audit events are now kept for # days.}}", "saveFailed": "Could not change how long events are kept." }, "export": { "button": "Export", "title": "Export what is shown", "hint": "Uses the current view, filters and date range.", "csv": "CSV", "json": "JSON", "failed": "Could not export the audit log." }, "emptyFiltered": "No events match these filters." }, "auth": { "backToSignIn": "Back to sign in", "plate": { "exLibris": "Ex Libris" }, "endpaper": { "change": "Change endpaper", "options": { "seigaiha": "Waves", "shippo": "Linked circles", "asanoha": "Hemp leaf", "quatrefoil": "Quatrefoil", "ogee": "Ogee", "harlequin": "Harlequin", "greekKey": "Greek key", "plain": "Plain" } }, "themePicker": { "switchToLight": "Switch to light", "switchToDark": "Switch to dark", "changeRadius": "Change corner radius", "changeBackground": "Change background", "changeAccent": "Change accent color" }, "fields": { "username": "Username", "password": "Password", "email": "Email", "emailAddress": "Email address", "fullName": "Full name", "newPassword": "New password", "confirmPassword": "Confirm password", "confirmNewPassword": "Confirm new password", "currentPassword": "Current password", "passwordHint": "Min. 8 characters with uppercase, lowercase, and a digit", "showPassword": "Show password", "hidePassword": "Hide password", "capsLockOn": "Caps Lock is on" }, "errors": { "generic": "Something went wrong. Please try again.", "passwordsDoNotMatch": "Passwords do not match" }, "login": { "subtitle": "Sign in to your account", "signIn": "Sign in", "signingIn": "Signing in...", "orDivider": "or", "forgotPassword": "Forgot password?", "resetPasswordAction": "Reset password", "noAccount": "Don't have an account?", "signUp": "Sign up", "registeredNotice": "Account created. Sign in to continue. An administrator needs to grant permissions before you can access the library.", "resetNotice": "Password updated. Sign in with your new password.", "errors": { "invalidCredentials": "Invalid username or password", "tooManyAttempts": "Too many login attempts. Please wait a minute and try again.", "passwordDisabled": "Password sign-in is disabled. Use a single sign-on provider.", "optionsUnavailable": "Sign-in options could not be loaded. Please refresh the page or contact your administrator.", "accountLocked": "Your password is correct, but this account is temporarily locked after too many failed sign-in attempts. Try again in {minutes, plural, one {# minute} other {# minutes}}, or reset your password to unlock it now." } }, "oidc": { "loginFailed": "OIDC login failed", "redirecting": "Redirecting...", "signInWith": "Sign in with {provider}", "completingSignIn": "Completing sign in...", "tryAgain": "Try again", "errors": { "stateExpired": "Your login session expired. Please try signing in again.", "tokenExchangeFailed": "Could not complete sign-in with your provider. Please try again or contact your administrator.", "userNotProvisioned": "Your account has not been set up. Contact your administrator for access.", "userInactive": "Your account has been deactivated. Contact your administrator.", "providerError": "Your identity provider returned an error. Please try again.", "missingCodeOrState": "Missing code or state parameter" }, "providerErrors": { "accessDenied": "Access was denied by the identity provider.", "loginRequired": "Authentication is required. Please sign in again.", "interactionRequired": "Additional user interaction is required." } }, "forgotPassword": { "subtitle": "Reset your password", "submitted": "If an account with that email exists, a reset link has been sent. Check your inbox.", "sending": "Sending...", "sendResetLink": "Send reset link", "errors": { "emailUnavailable": "Password reset via email is not available. Contact your administrator." } }, "resetPassword": { "subtitle": "Set a new password", "saving": "Saving...", "setNewPassword": "Set new password", "errors": { "invalidLink": "Invalid reset link. Please request a new one.", "invalidOrExpired": "Invalid or expired reset link. Please request a new one." } }, "register": { "title": "Create your account", "subtitle": "Sign up to get started.", "createAccount": "Create account", "creatingAccount": "Creating account...", "haveAccount": "Already have an account?", "signIn": "Sign in", "errors": { "closed": "Self-registration is not open on this server.", "taken": "That username or email is already in use.", "invalid": "Check the details you entered and try again.", "tooManyAttempts": "Too many attempts. Please wait a minute and try again.", "failed": "Failed to create account", "username": { "unsafeCharacters": "Your username cannot contain hidden or text-direction characters.", "untrimmed": "Your username cannot start or end with a space." }, "name": { "unsafeCharacters": "Your name cannot contain hidden or text-direction characters.", "untrimmed": "Your name cannot start or end with a space." } } }, "setup": { "title": "Initial setup", "subtitle": "Create the first administrator account.", "setupToken": "Setup token", "setupTokenHint": "(required in production)", "creatingAccount": "Creating account...", "createAccount": "Create administrator account", "errors": { "failed": "Failed to complete setup" } }, "changePassword": { "title": "Change password", "saving": "Saving…", "forcedNotice": "You must set a new password before continuing.", "errors": { "failed": "Failed to change password" } }, "magicLink": { "signingIn": "Signing you in...", "loginFailed": "Login failed", "goToLogin": "Go to login", "errors": { "noToken": "No token provided" } }, "reconnect": { "heading": "Waiting for the server", "description": "BookOrbit can't reach its server right now. This page continues on its own as soon as the server answers.", "retry": "Try again now", "retrying": "Trying again..." } }, "author": { "card": { "portraitAlt": "{name} portrait", "viewDetails": "View Author Details", "refreshMetadata": "Refresh Metadata", "deleteAuthor": "Delete Author" }, "filters": { "allLibraries": "All Libraries", "chips": { "groupLabel": "Filter authors", "all": "All", "noPortrait": "No portrait", "multipleBooks": "2+ books", "recentlyAdded": "Added this week", "noSortName": "No sort name" } }, "header": { "never": "Never", "portraitAlt": "{name} portrait", "actions": "Actions", "editAuthor": "Edit Author", "mergeAuthors": "Merge Authors", "refreshing": "Refreshing...", "refreshMetadata": "Refresh Metadata", "deleteAuthor": "Delete Author", "showLess": "Show less", "showMore": "Show more", "lookingUpMetadata": "Looking up author metadata...", "noBiography": "No biography available. Use the menu to refresh metadata.", "previewFrom": "Preview from {provider}. Save metadata to persist it.", "booksLabel": "Books", "lastAdded": "Last Added", "born": "Born", "died": "Died", "website": "Website", "genres": "Genres", "influences": "Influences", "findMatch": "Find the Right Author", "source": "Source", "pinned": "Pinned" }, "list": { "title": "Authors", "showControlsAria": "Show author controls", "searchPlaceholder": "Search authors", "sortButton": "Sort", "sortBy": "Sort by", "ascending": "Ascending", "descending": "Descending", "asc": "Asc", "desc": "Desc", "filters": "Filters", "clear": "Clear", "allLoaded": "All {total} authors loaded", "sort": { "name": "Name", "sortName": "Sort Name", "bookCount": "Book Count", "recentAdditions": "Recent Additions", "lastEnriched": "Last Enriched" }, "empty": { "title": "No authors found", "hint": "Try changing search text, sort, or library filter." }, "deleteDialog": { "titleOne": "Delete author?", "titleMany": "Delete {count} authors?", "descriptionOne": "This removes the author from the catalog and unlinks it from associated books. This action cannot be undone.", "descriptionMany": "This removes selected authors from the catalog and unlinks them from associated books. This action cannot be undone." }, "selection": { "selectVisible": "Select visible", "refreshMetadata": "Refresh metadata", "refreshingMetadata": "Refreshing metadata...", "confirmRefreshCount": "{count, plural, one {Refresh metadata for # author?} other {Refresh metadata for # authors?}}", "refreshAction": "Refresh", "deleteSelected": "Delete selected", "deleting": "Deleting...", "exitSelection": "Exit selection", "confirmDeleteCount": "{count, plural, =0 {Delete # author?} one {Delete # author?} other {Delete # authors?}}" }, "toast": { "refreshed": "Author metadata refreshed", "refreshedNoImage": "Metadata refreshed, but no author image was found.", "refreshFailed": "Failed to refresh author metadata", "bulkRefreshPartial": "Refreshed {updated} author(s), {failed} failed", "bulkRefreshSuccess": "Refreshed metadata for {updated} author(s)", "bulkRefreshFailed": "Failed to refresh selected authors", "deleteSuccess": "{count, plural, =0 {Deleted # author; affected {books} books} one {Deleted # author; affected {books} books} other {Deleted # authors; affected {books} books}}", "deleteFailed": "Failed to delete author(s)" } }, "detail": { "pageTitle": "Author", "pageTitleNamed": "Author · {name}", "pageTitleId": "Author #{id}", "entityName": "Author", "loadingAuthor": "Loading author...", "previewError": "Could not load external author preview metadata right now.", "edit": { "name": "Name", "sortName": "Sort Name", "description": "Description", "image": "Image", "uploading": "Uploading...", "replaceImage": "Replace image", "uploadImage": "Upload image", "removing": "Removing...", "removeImage": "Remove image", "imageHint": "PNG/JPEG/WEBP/GIF/BMP up to {size} MB", "saving": "Saving...", "website": "Website", "websitePlaceholder": "https://example.com", "websiteInvalid": "Enter a web address such as example.com.", "born": "Born", "died": "Died", "lifeDatePlaceholder": "1965 or 1965-03-14", "lifeDateHint": "Born and died take a year, or a full date as year-month-day.", "lifeDateInvalid": "Enter a year or a real date as year-month-day.", "genres": "Genres", "influences": "Influences" }, "merge": { "searchPlaceholder": "Search authors to merge into this author", "searching": "Searching...", "bookCount": "{count, plural, =0 {no books} one {# book} other {# books}}", "selectedSummary": "Selected {count} author(s), approx. {books} books affected.", "merging": "Merging...", "mergeSelected": "Merge Selected", "confirmLabel": "Merge" }, "mergeDialog": { "title": "Merge {count} author(s) into \"{name}\"?", "titleFallback": "Merge selected authors?", "description": "This will merge selected authors into the current author and re-link associated books. This action cannot be undone.", "descriptionEmpty": "This action cannot be undone." }, "deleteDialog": { "title": "Delete author?", "description": "This removes the author from the catalog and unlinks it from associated books. This action cannot be undone." }, "books": { "heading": "Books", "allLibraries": "All Libraries", "asc": "Asc", "desc": "Desc", "ascending": "Ascending", "descending": "Descending", "allLoaded": "All {total} books loaded", "sort": { "recentlyAdded": "Recently Added", "title": "Title", "publishedYear": "Published Year" }, "empty": { "title": "No books found for this author", "hint": "Try changing sort/order or selecting another library." } }, "toast": { "refreshed": "Author metadata refreshed", "refreshedNoImage": "Metadata refreshed, but no author image was found.", "refreshFailed": "Failed to refresh author metadata", "nameRequired": "Author name is required", "updated": "Author updated", "updateFailed": "Failed to update author", "imageUpdated": "Author image updated", "imageUploadFailed": "Failed to upload author image", "imageRemoved": "Author image removed", "imageRemoveFailed": "Failed to remove author image", "mergeSuccess": "Merged {count} author(s); affected {books} books", "mergeFailed": "Failed to merge authors", "deleteSuccess": "Deleted author; affected {books} books", "deleteFailed": "Failed to delete author" } }, "portrait": { "fromTheirBook": "Cover of one of their books; no portrait on file" }, "index": { "bookCount": "{count, plural, =0 {no books} one {# book} other {# books}}", "rowLabel": "{name}, {count, plural, =0 {no books} one {# book} other {# books}}", "actionsFor": "Actions for {name}", "refreshing": "Refreshing metadata for {name}", "deleting": "Deleting {name}" }, "match": { "title": "Find the right author", "description": "Pick the person behind {name}, from a name search or a pasted Goodreads or Audible link.", "search": { "label": "Name", "submit": "Search" }, "reference": { "label": "Goodreads or Audible link or ID", "placeholder": "goodreads.com/author/show/12345", "submit": "Look up", "unrecognised": "Paste a Goodreads or Audible author link, a Goodreads ID or an Audible ASIN.", "notFound": "No author has that ID.", "failed": "The lookup failed. Try again in a moment." }, "results": { "label": "Matches", "count": "{count, plural, =0 {No matches} one {# match} other {# matches}}", "searching": "Searching...", "empty": "No authors found. Try another spelling or paste a link.", "failed": "The search failed. Try again in a moment.", "current": "Current", "born": "Born {year}", "lifeSpan": "{born}–{died}" }, "detail": { "empty": "Pick a match to see who it is.", "loading": "Loading details...", "noBio": "No biography.", "viewOn": "View on {provider}", "back": "Back to matches", "use": "Use this author", "unpin": "Unpin", "pinnedHint": "Pinned: refreshes look this author up by ID instead of searching by name.", "currentHint": "The author is matched to this person now. Use it to pin the match." }, "confirm": { "title": "Use this {provider} author?", "description": "The bio, photo, dates, website, genres and influences are replaced with this author's, and later refreshes keep to this person.", "confirm": "Use this author" }, "toast": { "pinned": "Now matched to {name} on {provider}", "unpinned": "Unpinned. Refreshes search by name again.", "notFound": "{provider} has no author with that ID any more.", "providerDown": "{provider} could not be reached. Try again in a moment.", "failed": "Could not use this author.", "unpinFailed": "Could not unpin the match." } } }, "book": { "untitled": "Untitled", "placeholder": { "volume": "Vol. {number}", "genre": { "horror": "Horror", "romance": "Romance", "fantasy": "Fantasy", "scifi": "Sci-fi", "mystery": "Mystery", "classic": "Classics", "nonfiction": "Non-fiction", "young": "Young readers" } }, "unknownFormat": "unknown", "collapsedSeries": { "label": "Series", "bookCount": "{count, plural, =0 {no books} one {# book} other {# books}}", "readCount": "{count} read" }, "card": { "missing": "Missing" }, "file": { "primary": "Primary", "audiobook": "Audiobook" }, "formats": { "djvu": "DjVu document", "epub": "EPUB e-book", "kepub": "KEPUB e-book", "pdf": "PDF document", "cbz": "CBZ comic", "cbr": "CBR comic", "cb7": "CB7 comic", "mobi": "MOBI e-book", "azw3": "AZW3 e-book", "azw": "AZW e-book", "fb2": "FictionBook", "m4b": "M4B audiobook", "mp3": "MP3 audio", "m4a": "M4A audio", "opus": "Opus audio", "ogg": "OGG audio", "flac": "FLAC audio", "readAlong": "Read-aloud EPUB", "primary": "Primary format" }, "actions": { "read": "Read", "listen": "Listen", "startReading": "Start reading", "continueReading": "Continue reading", "startListening": "Start listening", "continueListening": "Continue listening", "peek": "Peek", "quickView": "Quick View", "details": "Details", "bookDetails": "Book Details", "download": "Download", "metadata": "Metadata", "editMetadata": "Edit Metadata", "refreshMetadata": "Refresh Metadata", "regenerateCover": "Regenerate Cover", "addToCollection": "Add to Collection", "setStatus": "Set Status", "sendViaEmail": "Send via Email", "rate": "Rate {star}", "openAs": "Open as {format}", "openReadAlong": "Open read-aloud EPUB" }, "refreshMetadata": { "success": "Metadata refreshed", "failed": "Metadata refresh failed" }, "coverRegeneration": { "failed": "Could not regenerate the cover", "bulkInProgress": "Re-extracting covers", "bulkFailed": "Could not re-extract covers", "bulkCompleted": "Re-extracted {updated} of {processed, plural, one {# cover} other {# covers}}" }, "readStatus": { "unread": "Unread", "wantToRead": "Want to Read", "reading": "Reading", "onHold": "On Hold", "rereading": "Rereading", "read": "Read", "skimmed": "Skimmed", "abandoned": "Abandoned" }, "download": { "action": "Download", "audiobookZip": "Audiobook (ZIP)", "allFormatsZip": "All formats (ZIP)", "primaryOnlyZip": "Primary only (ZIP)", "preparing": "Preparing download...", "preparingExport": "Preparing {count, plural, one {# book} other {# books}} for download...", "progressPercent": "Downloading {percent} of {total}", "progressBytes": "Downloading {transferred}", "failed": "Download failed", "exportFailed": "Export failed", "audiolessEpub": "KOReader EPUB", "audiolessEpubHint": "Download EPUB for KOReader with audio files removed", "noAudio": "no audio", "textOnlyEpub": "Text-only EPUB", "textOnlyEpubHint": "Download a narration-free EPUB while preserving reading anchors.", "originalNarrated": "Original EPUB with narration", "originalNarratedEpub": "Original EPUB with narration" }, "sort": { "moveUp": "Move up", "moveDown": "Move down", "ascending": "Ascending", "descending": "Descending", "fields": { "relevance": "Relevance", "author": "Author", "title": "Title", "series": "Series", "seriesIndex": "Series #", "addedAt": "Date Added", "updatedAt": "Date Updated", "publishedDate": "Published Date", "publishedYear": "Published Year", "pageCount": "Page Count", "rating": "Rating", "publisher": "Publisher", "fileSize": "File Size", "readProgress": "Read Progress", "readStatus": "Read Status", "format": "Format", "lastReadAt": "Last Read", "startedAt": "Date Started", "finishedAt": "Date Finished", "random": "Random", "language": "Language", "metadataScore": "Metadata Score", "collectionOrder": "Order Added" }, "customFieldsGroup": "Custom fields", "customFieldFallback": "Custom field", "remove": "Remove", "emptyState": "No sort configured. Title ascending will be used.", "addLevel": "Add sort level" }, "filter": { "match": "Match", "all": "ALL", "any": "ANY", "ofFollowingRules": "of the following rules", "fields": { "title": "Title", "publisher": "Publisher", "language": "Language", "series": "Series", "seriesIndex": "Series Index", "publishedDate": "Published Date", "publishedYear": "Published Year", "pageCount": "Page Count", "author": "Author", "genre": "Genre", "tag": "Tag", "collection": "Collection", "library": "Library", "format": "Format", "fileSize": "Primary File Size", "addedAt": "Added Date", "startedAt": "Date Started", "finishedAt": "Date Finished", "fileAvailability": "File Availability", "rating": "Rating", "communityRating": "Community Rating", "communityRatingCount": "Community Review Count", "readProgress": "Reading Progress", "readStatus": "Read Status", "description": "Description", "isbn": "ISBN", "metadataScore": "Metadata Score", "cover": "Cover", "audioCover": "Audiobook Cover", "lockStatus": "Lock Status", "seriesStatus": "Series Status" }, "operators": { "contains": "contains", "notContains": "does not contain", "startsWith": "starts with", "endsWith": "ends with", "eq": "is", "notEq": "is not", "isEmpty": "is empty", "isNotEmpty": "is not empty", "gt": "greater than", "gte": "at least", "lt": "less than", "lte": "at most", "between": "between", "includesAny": "includes any of", "includesAll": "includes all of", "excludesAll": "excludes all of", "before": "before", "after": "after", "withinLast": "within last", "moreThanAgo": "more than", "isMissing": "is missing", "isPresent": "is present", "isUnread": "is unread", "isInProgress": "is in progress", "isFinished": "is finished", "isLocked": "is locked", "isUnlocked": "is unlocked", "isUpNext": "is up next", "isTrue": "is yes", "isFalse": "is no" }, "customFieldsGroup": "Custom fields", "customFieldFallback": "Custom field", "anyProvider": "Any provider", "communityRatingProvider": "Community rating provider", "loadingLibraries": "Loading libraries...", "noLibrariesAvailable": "No libraries available", "selectLibrary": "Select library...", "selectStatus": "Select status...", "withinLastPlaceholder": "e.g. 7", "unit": { "days": "days", "daysAgo": "days ago", "weeks": "weeks", "months": "months", "megabytes": "MB" }, "scorePreset": { "outstanding": "Outstanding", "good": "Good", "fair": "Fair", "poor": "Poor" }, "scoreRangePlaceholder": "0-100", "fileSizePlaceholder": "e.g. 10", "fileSizeValueAria": "Primary file size in megabytes", "fileSizeMaximumAria": "Maximum primary file size in megabytes", "valuePlaceholder": "value", "maxPlaceholder": "max", "to": "to", "group": "Group", "addRule": "Add rule", "addGroup": "Add group", "typeToSearch": "Type to search..." }, "deleteDialog": { "title": "Delete book?", "description": "This will permanently delete the book and all its metadata, files, reading progress, and bookmarks. This cannot be undone.", "keepsHistory": "Finished reads stay in each reader's history, under the book's title and author." }, "bulkEdit": { "title": "{count, plural, =0 {Edit metadata - # book} one {Edit metadata - # book} other {Edit metadata - # books}}", "instructions": "Toggle fields to edit, then configure values. Only toggled fields will be changed.", "invalidYear": "Enter a valid year (numbers only)", "clearWarning": "This will remove all {field} from the selected books.", "searchPlaceholder": "Search {field}...", "enterPlaceholder": "Enter {field}", "yearPlaceholder": "e.g. 2024", "leaveEmptyHint": "Leave empty to clear this field on all selected books.", "applying": "Applying...", "apply": "Apply", "mode": { "add": "Add", "remove": "Remove", "replace": "Replace", "clear": "Clear" } }, "export": { "title": "Export Metadata", "scope": "Scope", "selectedRows": "Selected rows", "currentlySelected": "{count} currently selected", "allMatchingRows": "All matching rows", "rowsInResult": "{count} rows in current result", "format": "Format", "csvDescription": "Spreadsheet-friendly, UTF-8 BOM included", "jsonDescription": "Structured export with metadata context", "columns": "Columns", "canonicalSchema": "Stable canonical schema", "visibleColumns": "Current visible columns", "options": "Options", "includePersonalData": "Include personal reading data", "includeFilePaths": "Include file paths (advanced)", "includeContextMeta": "Include context metadata", "preflight": "Preflight", "scopeLabel": "Scope: {summary}", "calculatingSize": "Calculating export size...", "estimatedSize": "Estimated size:", "fileLabel": "File: {fileName}", "exportAction": "Export", "selectedRowsSummary": "{count, plural, =0 {# selected row} one {# selected row} other {# selected rows}}", "matchingRowsSummary": "{count, plural, =0 {# matching row} one {# matching row} other {# matching rows}}", "prepareFailed": "Failed to prepare export", "exportStarted": "Metadata export started: {fileName}", "exportFailed": "Metadata export failed" }, "columnPanel": { "columnsHeading": "Columns", "reset": "Reset", "tableDensity": "Table density", "density": { "compact": "Compact", "comfortable": "Comfortable", "roomy": "Roomy" }, "presets": "Presets", "exportBackup": "Export presets and saved views", "importBackup": "Import presets and saved views", "rename": "Rename", "renamePrompt": "Enter a new name", "builtIn": "Built in", "saveCurrentPreset": "Save current preset", "savedViews": "Saved views", "savedViewsEmpty": "Save sort, layout, and view-specific filters for quick reuse.", "saveCurrentView": "Save current view", "pinnedLeft": "Pinned left", "pinnedRight": "Pinned right", "columns": { "cover": "Cover", "read": "Read", "actions": "Actions" } }, "shortcuts": { "title": "Keyboard Shortcuts", "navigation": { "title": "Navigation", "moveFocusVertical": "Move focus up/down", "moveFocusHorizontal": "Move focus left/right", "jumpFirstColumn": "Jump to first column", "jumpLastColumn": "Jump to last column", "jumpFirstRow": "Jump to first row", "jumpLastRow": "Jump to last row" }, "actions": { "title": "Actions", "editCell": "Edit focused cell", "cancelEditing": "Cancel editing / Close overlay", "toggleRowSelection": "Toggle row selection", "copyCell": "Copy cell value", "copyRow": "Copy focused row" }, "general": { "title": "General", "toggleHelp": "Toggle this help overlay" } }, "jumpRail": { "jumpToSection": "Jump to section", "jumpTo": "Jump to {label}", "unknownDate": "Unknown date", "unknownValue": "Unknown value" }, "quickView": { "title": "Book quick view", "titleFor": "Quick view for {title}", "description": "Preview book details and run quick actions.", "openIn": "Open in {provider}", "pages": "{count, plural, =0 {# page} one {# page} other {# pages}}", "primaryFile": "Primary File", "fileNumber": "File #{id}", "showLess": "Show less", "showMore": "Show more", "collections": "Collections", "noDescription": "No description available.", "openMetadataEditor": "Open metadata editor", "coverPreview": "Book cover preview", "coverPreviewFor": "{title} cover preview", "coverPreviewDescription": "Enlarged cover image preview dialog." }, "tableView": { "openBookDetails": "Open book details", "openSeries": "Open series", "metadataRefreshFailed": "Metadata refresh failed", "booksSelected": "{count, plural, =0 {# book selected} one {# book selected} other {# books selected}}", "loadingMoreBooks": "Loading more books", "sort": "Sort", "refreshingMetadata": "Refreshing metadata {processed} / {total}", "failedCount": "{count} failed", "remainingCount": "{count} remaining", "readOnlyNotice": "Table editing is disabled on smaller screens. Switch to list or grid for quicker actions.", "fetching": "Fetching...", "updated": "Updated", "failed": "Failed", "noBooks": "No books to display", "scrollToTop": "Scroll to top", "selectedStatus": "{count} selected", "filtered": "Filtered", "loadedStatus": "{loaded} of {total} loaded", "bookCount": "{count, plural, =0 {# book} one {# book} other {# books}}", "keyboardShortcutsTitle": "Keyboard shortcuts (?)", "showKeyboardShortcuts": "Show table keyboard shortcuts", "copyHint": "Copy cell: Ctrl/Cmd+C · Copy row: Ctrl/Cmd+Shift+C" }, "detail": { "authorBooks": { "alsoByAuthor": "Also by this author", "alsoByAuthors": "Also by these authors" }, "header": { "previousBook": "Previous book", "nextBook": "Next book", "backToLibrary": "Back to {library}" }, "tabs": { "details": "Details", "editMetadata": "Edit Metadata", "files": "Files", "chapters": "Chapters", "readingLog": "Reading Log", "highlights": "Highlights" }, "discover": { "moreInSeries": "More in Series", "byAuthor": "By Author", "similarBooks": "Similar Books" }, "recommended": { "moreLikeThis": "More Like This" }, "series": { "moreInSeries": "More in the {series} series" }, "writeRename": { "written": "{count, plural, =0 {no fields written} one {Written (one field)} other {Written (# fields)}}", "writeFailed": "Write failed", "skipped": "Skipped", "renamedTo": "Renamed to {name}", "fileRenamed": "File renamed", "renameFailed": "Rename failed", "autoWriteAndRenameDisabled": "Auto-write and rename are disabled in library settings. Changes won't sync automatically on future saves.", "autoWriteDisabled": "Auto-write is disabled in library settings. Changes won't sync automatically on future saves.", "autoRenameDisabled": "Auto-rename is disabled in library settings. Changes won't sync automatically on future saves.", "writeLabel": "Write:", "renameLabel": "Rename:" }, "addFile": { "uploading": "Uploading...", "uploadComplete": "Upload complete", "title": "Add File", "dropzone": { "title": "Drop files here or click to browse", "hint": "epub, pdf, mobi, cbz, m4b and more - up to {size} MB each" }, "addMore": "Add more files", "fileCount": "{count, plural, =0 {no files} one {one file} other {# files}}", "clearAll": "Clear all", "done": "Done", "retry": "Retry", "filesAdded": "{count, plural, =0 {no files added} one {one file added} other {# files added}}", "uploadedFailed": "{done} uploaded, {failed} failed", "uploadingProgress": "{done} of {total} uploading...", "renameAfter": "Rename all book files after upload", "uploadCount": "Upload ({count})", "upload": "Upload" }, "addSession": { "errors": { "invalidDate": "Pick a valid date and time.", "future": "The session cannot start in the future.", "duration": "Duration must be between 1 and 1440 minutes.", "endProgress": "End progress must be between 0 and 100." }, "title": "Add reading session", "startedAt": "Started at", "duration": "Duration (minutes)", "endProgress": "End progress %", "optional": "Optional", "format": "Format", "noFormat": "No specific format", "saving": "Saving...", "submit": "Add session" }, "coverEditor": { "unlockCover": "Unlock cover", "lockCover": "Lock cover", "fileTab": "File", "urlTab": "URL", "chooseImage": "Choose image...", "findCoverOnline": "Find cover online", "saving": "Saving...", "saveCover": "Save cover", "revertToOriginal": "Revert to original", "regenerateCover": "Regenerate Cover", "slotsLabel": "Cover to edit", "slotEbook": "Book", "slotAudio": "Audiobook", "slotEbookName": "Book cover", "slotAudioName": "Audiobook cover", "editingEbook": "Editing the book cover", "editingAudio": "Editing the audiobook cover", "lockEbookCover": "Lock book cover", "unlockEbookCover": "Unlock book cover", "lockAudioCover": "Lock audiobook cover", "unlockAudioCover": "Unlock audiobook cover", "viewLarger": "View larger", "viewLargerEbook": "View larger book cover", "viewLargerAudio": "View larger audiobook cover", "sourceMode": "Image source", "urlLabel": "Image URL", "saveFailed": "Could not save the cover", "revertFailed": "Could not revert the cover" }, "coverLightbox": { "title": "Cover preview", "description": "The full-size cover. Press Escape to close.", "switchLabel": "Cover to show", "ebook": "Book", "audio": "Audiobook" }, "coverSearch": { "title": "Online Search", "subtitle": "Search for book covers", "titleField": "Title", "authorField": "Author", "sourceField": "Source", "allSources": "All Sources", "audiobookCovers": "Audiobook covers", "squareHint": "(square)", "searching": "Searching...", "findCovers": "Find covers", "selectCover": "Select Cover", "noResultsTitle": "No results found", "noResultsHint": "Try adjusting your search terms", "readyTitle": "Ready to search", "readyHint": "Enter a title and author above", "resolutionTip": "Tip: High resolution covers are marked in green" }, "details": { "by": "by", "narratedBy": "narrated by", "ratingLocked": "Rating is locked", "rateStar": "Rate {star}", "listen": "Listen", "read": "Read", "chooseFormat": "Choose format", "audiobook": "Audiobook", "primary": "Primary", "peek": "Peek", "sendViaEmail": "Send via Email", "personalReview": { "title": "Personal Review", "toggleAria": "Toggle personal review", "editAria": "Edit personal review", "placeholder": "Private review", "clearAria": "Clear personal review", "cancelEditAria": "Cancel personal review edit" }, "editCover": "Edit cover", "viewCover": "View larger cover", "coverStack": { "show": { "ebook": "Show the book cover", "audio": "Show the audiobook cover" }, "front": { "ebook": "Showing the book cover", "audio": "Showing the audiobook cover" } }, "readAloudInvite": { "chip": "Read-aloud", "title": "Create a read-aloud from this book's EPUB and audiobook" }, "finished": "Finished", "resetFileProgress": "Reset file progress", "resetEditionProgress": "Reset progress for {format}", "resetting": "Resetting...", "resetProgressConfirm": "Reset stored reading progress for {label}?", "moreCount": "+{count} more", "untitled": "Untitled", "metadataScore": "Metadata Score", "primaryFormat": "Primary format", "readAloudSync": { "title": "Read-aloud progress sync", "state": { "enabled": "Enabled", "disabled": "Disabled", "unavailable": "Unavailable", "epubCopiesOnly": "EPUB copies only" }, "chip": { "enabled": "Synced", "partial": "Partly synced", "disabled": "Sync off", "unavailable": "Sync issue" }, "chipAria": "Read-aloud progress sync: {status}", "noneYet": "No read-aloud EPUB yet. Create one to sync positions between the audiobook and the text.", "enabledDescription": "Audiobook, web reader, Kobo, and KOReader positions stay in sync.", "disabledDescription": "Each format keeps its own reading position.", "epubCopiesDescription": "Web reader, Kobo, and KOReader positions stay in sync across the EPUB copies. Add matching audiobook files to sync the audiobook too.", "reason": { "no_media_overlay_epub": "A read-aloud EPUB with media overlays is required.", "no_audio_files": "Matching standalone audiobook files are required.", "missing_duration": "Audio duration metadata is incomplete.", "durationMismatch": "Durations do not match closely enough: audiobook {audio}, read-aloud EPUB {overlay}." }, "enable": "Enable", "disable": "Disable", "saving": "Saving...", "saveFailed": "Could not update read-aloud progress sync." }, "openIn": "Open in {provider}", "showLess": "Show less", "showMore": "Show more", "publisher": "Publisher", "published": "Published", "language": "Language", "pages": "Pages", "duration": "Duration", "edition": "Edition", "abridged": "Abridged", "unabridged": "Unabridged", "isbn": "ISBN", "fileSize": "File Size", "library": "Library", "added": "Added", "cancelDateAddedEdit": "Cancel date added edit", "editDateAdded": "Edit date added", "dateStarted": "Date Started", "saving": "Saving...", "cancelDateStartedEdit": "Cancel date started edit", "editDateStarted": "Edit date started", "dateFinished": "Date Finished", "cancelDateFinishedEdit": "Cancel date finished edit", "editDateFinished": "Edit date finished", "customMetadata": "Custom Metadata", "synopsis": "Synopsis", "noDescription": "No description available.", "dateStartedFutureError": "Date Started cannot be in the future.", "dateAddedRequiredError": "Date Added is required.", "dateAddedFutureError": "Date Added cannot be in the future.", "dateFinishedFutureError": "Date Finished cannot be in the future.", "dateFinishedBeforeStartedError": "Date Finished must be on or after Date Started.", "dateFinishedBeforeStartedErrorWithDate": "Date Finished must be on or after Date Started ({date}).", "saveReadingDatesError": "Failed to save reading dates.", "saveAddedDateError": "Failed to save date added.", "koboPendingDelete": "Pending delete from device", "koboPendingDeleteTooltip": "Kobo will remove it on next sync.", "koboRemovedByDevice": "Removed by device", "koboRemovedByDeviceTooltip": "Kobo reported this book removed.", "koboNotSynced": "Not synced", "koboNotSyncedTooltip": "Queued for next Kobo sync.", "filesNotFound": "Files not found", "filesNotFoundDescription": "The file(s) for this book can no longer be found on disk. Metadata is still available. Run a library scan to confirm, or remove the record.", "resetHoldNotice": "{device} still has the old position ({percent})", "resetHoldRelease": "Use this device's position", "resetHoldReleasing": "Releasing...", "resetHoldReleaseFailed": "Could not use this position. Try again.", "editions": "Editions", "editionsSummary": "{count} · {size}", "moreFormats": "+{count} more", "filesOnDisk": "Files on disk", "yourReading": "Your reading", "lastRead": "last read {when}", "notStarted": "not started", "noSessionsYet": "No reading sessions yet. Opening this book in the reader tracks time, pace and per-device progress.", "activitySessions": "Sessions", "activityTime": "Time", "activityAverage": "Avg", "activityProgress": "Progress", "activityDayTooltip": "{day}: {minutes} min", "activityReached": "{percent} reached", "durationS": "{seconds}s", "durationM": "{minutes}m", "durationHm": "{hours}h {minutes}m", "yourReview": "Your review", "reviewNotWritten": "Not written yet", "writeReview": "Write", "collections": "Collections", "noCollections": "None", "onDisk": "On disk", "detailsHeading": "Details", "percentUnderOne": "<1%", "percentOverNinetyNine": ">99%" }, "editMetadata": { "fieldCount": "{count, plural, =0 {no fields} one {one field} other {# fields}}", "bookFilesTarget": "book files", "formatFilesTarget": "{formats} files", "noPrimaryFile": "No primary file available", "formatNotSupported": "This file format does not support write-back", "formatDisabled": "Write-back is disabled for this format", "fileExceedsSizeLimit": "This file exceeds the write-back size limit", "writing": "Writing...", "saveInProgress": "Save in progress", "writeManualLibraryDisabled": "Write metadata to file and rename on disk; automatic write-back is disabled for this library", "writeManualTooltip": "Write {fields} to {target} and rename on disk", "applyResult": "{skipped}, {updated}", "skippedLockedFields": "{count, plural, =0 {Skipped no locked fields} one {Skipped one locked field} other {Skipped # locked fields}}", "updatedFields": "{count, plural, =0 {updated no fields} one {updated one field} other {updated # fields}}", "wroteFieldsToFile": "Wrote {fields} to file", "fileWriteFailedReason": "File write failed: {reason}", "fileWriteFailed": "File write failed", "fileWriteSkippedReason": "File write skipped: {reason}", "fileWriteSkipped": "File write skipped", "metadataSaved": "Metadata saved", "metadataWrittenToFile": "Metadata written to file", "savedButWriteFailedReason": "Metadata saved, but file write failed: {reason}", "savedButWriteFailed": "Metadata saved, but file write failed", "savedWriteSkippedReason": "Metadata saved, file write skipped: {reason}", "savedWriteSkipped": "Metadata saved, file write skipped", "saveFailed": "Could not save the changes", "saveFailedWithStatus": "Could not save the changes (HTTP {status})", "loadFromFileFailed": "Failed to load metadata from file", "loadedFieldsFromFile": "{count, plural, =0 {Loaded no fields from file} one {Loaded one field from file} other {Loaded # fields from file}}", "noMetadataInFile": "No metadata found in file", "loadFromFile": "Load from file", "loadFromFileTooltip": "Load metadata from the primary book file", "writeToFile": "Write to file", "autoFill": "Auto-fill", "autoFillFailed": "Auto-fill failed", "fetchingMetadata": "Fetching metadata...", "noExistingProviderIds": "No metadata fetched: none of the active Field Rule providers has an ID stored on this book.", "allFieldsLocked": "All fields are locked", "autoFillTooltip": "Auto-fill fields using your metadata preferences", "lockAll": "Lock all", "lockAllTooltip": "Lock all fields", "unlockAll": "Unlock all", "unlockAllTooltip": "Unlock all fields", "saving": "Saving...", "fileWriteBackDetails": "File write-back details", "fileWriteBack": "File write-back", "enabled": "Enabled", "saveWritesMetadata": "'Save' writes metadata to {target}", "formats": "Formats", "bookFiles": "Book files", "supportedFields": "Supported fields", "titleLabel": "Title", "subtitleLabel": "Subtitle", "authorsLabel": "Authors", "narratorsLabel": "Narrators", "genresLabel": "Genres", "tagsLabel": "Tags", "ratingLabel": "Rating", "rateStar": "Rate {star}", "clear": "Clear", "communityRatingsLabel": "Community Ratings", "noProviderRatings": "No provider ratings", "seriesLabel": "Series", "publisherLabel": "Publisher", "languageLabel": "Language", "yearLabel": "Year", "pageCountLabel": "Page Count", "isbn13Label": "ISBN-13", "isbn10Label": "ISBN-10", "durationLabel": "Duration (s)", "abridgedLabel": "Abridged", "providerIds": "Provider IDs", "externalProviderUnavailable": "{provider} is no longer registered, so this id is kept but not used", "clearExternalProviderId": "Clear the {provider} id", "comicDetails": "Comic Details", "comicIssueNumberLabel": "Issue Number", "comicVolumeLabel": "Volume", "comicStoryArcsLabel": "Story Arcs", "comicPencillersLabel": "Pencillers", "comicInkersLabel": "Inkers", "comicColoristsLabel": "Colorists", "comicLetterersLabel": "Letterers", "comicCoverArtistsLabel": "Cover Artists", "comicCharactersLabel": "Characters", "comicTeamsLabel": "Teams", "comicLocationsLabel": "Locations", "customMetadata": "Custom Metadata", "descriptionLabel": "Description", "unlockField": "Unlock {field}", "lockField": "Lock {field}", "diffPanel": { "untitled": "Untitled", "noFieldsSelected": "No fields selected", "fieldsSelected": "{count, plural, =0 {no fields selected} one {one field selected} other {# fields selected}}", "results": "Results", "providerMatches": "{provider} matches", "selectedOf": "Selected {selected} of {total}", "yearUnknown": "Year unknown", "indexOf": "{index} of {total}", "switchedResult": "Switched result. Previous selections from this provider were cleared.", "selectFieldsToApply": "Select fields to apply", "copyMissing": "Copy Missing", "copyAll": "Copy All", "hideUnchanged": "Hide unchanged", "showUnchanged": "Show unchanged", "current": "Current", "new": "New", "noMetadata": "No metadata available from this source.", "noChangedFields": "No changed or missing fields. Use Show unchanged to inspect everything.", "applyToForm": "Apply to form", "secondCover": { "audioResults": "Audiobook cover results", "bookResults": "Book cover results", "showCover": "Show the {provider} cover, {index} of {total}", "searchingAudio": "Searching audiobook editions...", "searchingBook": "Searching book editions...", "noAudio": "No audiobook covers found.", "noBook": "No book covers found." } }, "diff": { "locked": "Locked", "previewAlt": "Preview", "currentCoverAlt": "Current cover", "newCoverAlt": "New cover", "pickCoverFromProvider": "Pick cover from another provider", "pickCoverSource": "Pick cover source", "coverShapeHint": { "portraitForAudio": "Portrait image. Audiobook covers are square.", "squareForBook": "Square image. Book covers are portrait." }, "pickFromProvider": "Pick from another provider", "pickSource": "Pick source", "useNew": "Use the new {field}", "keepCurrent": "Keep the current {field}", "genreWriteMode": { "label": "How to apply genres", "merge": "Merge", "replace": "Replace" }, "empty": "empty", "showLess": "Show less", "showMore": "Show more", "coverPreviewAlt": "Cover preview", "fields": { "coverUrl": "Cover", "bookCover": "Book cover", "audioCover": "Audiobook cover", "title": "Title", "subtitle": "Subtitle", "authors": "Authors", "description": "Description", "publisher": "Publisher", "publishedDate": "Published", "language": "Language", "pageCount": "Page count", "communityRating": "Community rating", "seriesName": "Series", "seriesIndex": "Series index", "isbn13": "ISBN-13", "isbn10": "ISBN-10", "genres": "Genres", "narrators": "Narrators", "durationSeconds": "Duration (seconds)", "abridged": "Abridged", "hardcoverEditionId": "Hardcover edition ID", "comicIssueNumber": "Issue number", "comicVolumeName": "Volume", "comicPencillers": "Pencillers", "comicInkers": "Inkers", "comicColorists": "Colorists", "comicLetterers": "Letterers", "comicCoverArtists": "Cover artists", "comicCharacters": "Characters", "comicTeams": "Teams", "comicLocations": "Locations", "comicStoryArcs": "Story arcs", "sourceUrl": "Source URL" }, "providerIds": { "google": "Google Books ID", "goodreads": "Goodreads ID", "amazon": "Amazon ID", "hardcover": "Hardcover ID", "openLibrary": "Open Library ID", "itunes": "iTunes ID", "audible": "Audible ID", "librofm": "Libro.fm ISBN", "comicvine": "ComicVine ID", "ranobedb": "RanobeDB ID", "kobo": "Kobo ID", "lubimyczytac": "LubimyCzytac ID", "aladin": "Aladin ID" } }, "searchDrawer": { "searchTitle": "Search Metadata", "autoSearchOnOpen": "Search automatically when opened", "autoSearchOnOpenHint": "Uses the book's details next time this panel opens. Remembered for your account in this browser.", "searchOptions": "Search options", "compareTitle": "Compare Metadata", "searchSubtitle": "Find the best provider match for this book.", "compareSubtitle": "Review differences and apply only what you want." }, "searchPanel": { "untitledQuery": "Untitled query", "titlePlaceholder": "Title", "authorPlaceholder": "Author", "isbnPlaceholder": "ISBN", "searching": "Searching...", "activeQuery": "Active query", "searchScope": "Search scope", "allEnabled": "All enabled", "all": "All", "fieldRules": "Field Rules", "custom": "Custom", "providerNotInFieldRules": "{provider} is enabled but not in Field Rules", "notInFieldRulesLabel": "Not in Field Rules:", "notInFieldRulesText": "{providers}. Included in manual search with All enabled, but not used by automatic metadata fetch.", "noResults": "No results found", "noResultsHint": "Try adjusting the title or author", "searchInterrupted": "The search did not finish", "searchIncomplete": "Some results may be missing", "providerTimedOut": "{provider} took too long to respond.", "providerThrottled": "{provider} has hit its rate limit. Wait a moment and try again.", "providerFailed": "{provider} could not be reached.", "searchInterruptedHint": "Try again, or narrow the search scope.", "searchPrompt": "Search above, then click a result to start comparing metadata." }, "match": { "sheetDescription": "Search metadata providers and choose what to copy into this book.", "mediumAudiobook": "Audiobook", "mediumEbook": "Ebook", "query": { "label": "Metadata search", "title": "Title", "author": "Author", "isbn": "ISBN", "edited": "Query edited", "useBookDetails": "Use book details" }, "sources": { "heading": "Sources", "allEnabledHint": "{count, plural, one {# source. Best for a manual search.} other {# sources. Best for a manual search.}}", "fieldRulesHint": "{count, plural, one {# source, the one automatic fetch uses.} other {# sources, the ones automatic fetch uses.}}", "outsideRules": "{providers} {count, plural, one {is enabled but not in Field Rules, so automatic fetch skips it.} other {are enabled but not in Field Rules, so automatic fetch skips them.}}", "manualOnly": "{providers}: manual search only, not used by automatic fetch.", "count": "{provider}: {count, plural, =0 {no results} one {# result} other {# results}}", "searching": "{provider}: searching", "stopped": "{provider}: stopped before finishing" }, "results": { "label": "Matches", "best": "Best matches", "otherEditions": "Other editions", "otherBooks": "Probably different books", "stillSearching": "Still searching", "linked": "Linked", "linkedHint": "This record is already linked to the book", "isbn": "ISBN match", "fills": "+{count} empty", "fillsHint": "{count, plural, one {Fills # empty field} other {Fills # empty fields}}", "differ": "{count} differ", "differHint": "{count, plural, one {# field differs from the book} other {# fields differ from the book}}", "inSync": "In sync", "inSyncHint": "Nothing here would change the book", "differentAuthor": "Different author", "titleDiffers": "Title differs", "sparse": "Sparse", "sparseHint": "{count, plural, one {Only # field filled} other {Only # fields filled}}", "staged": "{count, plural, one {# change staged from this result} other {# changes staged from this result}}", "noMatches": "No matches for this query", "noMatchesHint": "{count, plural, one {The source answered with nothing.} other {# sources answered with nothing.}} Loosen the search and try again.", "searchTitleOnly": "Search title only", "prompt": "Enter a title or ISBN to search.", "mayBeMissing": "Results from it may be missing.", "retry": "Retry {provider}", "pages": "{count, plural, one {# page} other {# pages}}", "fetched": "Fetched" }, "tier": { "strong": "Strong match", "possible": "Possible match", "weak": "Unlikely match" }, "compare": { "label": "Compare", "backToMatches": "Back to matches", "previous": "Previous result", "next": "Next result", "position": "{index} of {total}", "viewOn": "View on {provider}", "linkedToBook": "Linked to this book", "sameTitleAuthor": "Same title and author", "streaming": "Showing the best match so far. Still waiting on {providers}.", "rows": "Rows", "differences": "Differences", "allFields": "All fields", "fillEmpty": "{count, plural, =0 {No empty fields} one {Fill # empty} other {Fill # empty}}", "takeAll": "{count, plural, =0 {Nothing to use} one {Use #} other {Use all #}}", "more": "More actions", "clearAll": "Clear all picks", "clearAllHint": "Back to the book's current values.", "field": "Field", "pickTitle": "Pick a match to compare", "pickHint": "Choose a result. Its fields line up against the book so you can keep or replace each one.", "noneTitle": "Nothing to compare yet", "noneHint": "When a search finds matches, the best one opens here next to what {title} has today.", "allMatch": "Every field matches the book. Switch to All fields to see them.", "toReview": "{count, plural, =0 {Nothing to review} one {# to review} other {# to review}}", "stagedInSection": "{count} staged" }, "sections": { "identity": "Identity", "description": "Description", "publication": "Publication", "series": "Series", "genres": "Genres", "comics": "Comic credits", "identifiers": "Identifiers", "ratings": "Community rating" }, "kind": { "fill": "Fills empty", "change": "Differs", "same": "Same", "missing": "Not provided" }, "minor": { "reordered": "Reordered", "formatting": "Formatting only", "punctuation": "Punctuation", "capitalization": "Capitalization", "yearOnly": "Year only", "addsDay": "Adds the day", "languageCode": "Same language", "ratingCount": "Count only" }, "decision": { "keep": "Keep", "use": "Use", "merge": "Merge", "replace": "Replace", "alreadyMatches": "Already matches", "nothingToApply": "Nothing to apply", "lockedHint": "Unlock it in the editor to change it.", "usingFrom": "Using the value from", "switchTo": "Switch to {provider}" }, "value": { "empty": "Empty", "notProvided": "Not provided", "showAll": "Show all {count} words", "otherValues": "{count, plural, one {# other value} other {# other values}}", "otherValuesHeading": "{field} from other results", "otherValuesHint": "Choosing one stages it for this field", "sameAsCurrent": "Same as current", "useThis": "Use this", "using": "Using" }, "providerRating": "{provider} rating", "cover": { "slotAudio": "Audiobook slot, square", "slotBook": "Book slot, portrait", "current": "Current", "staged": "Staged", "size": "{width} × {height}", "fits": "Fits the slot", "portraitInSquare": "Portrait: letterboxed", "squareInPortrait": "Square: letterboxed", "broken": "Looks broken", "unknown": "Shape unknown", "fitShort": "Fits", "portraitShort": "Portrait", "squareShort": "Square", "brokenShort": "Broken", "noCover": "No cover in this result", "noCurrent": "No cover yet", "strip": "Covers from matching results", "stripMeta": "{count, plural, one {# cover} other {# covers}}, fitting first", "choose": "Choose a cover", "preview": "Preview the covers full screen", "previewTitle": "Covers side by side", "previewDescription": "The current cover next to the one that would replace it.", "choice": "{provider} cover", "choiceSized": "{provider} cover, {width} by {height}", "using": "Using" }, "footer": { "changes": "{count, plural, one {# change} other {# changes}}", "from": "from", "nothingStaged": "Nothing staged. Choose Use on a field or pick a cover.", "nothingStagedShort": "Nothing staged", "formHint": "Fills the edit form. Save there to keep it.", "fileHint": "Saves to this file's metadata.", "apply": "{count, plural, =0 {Apply} one {Apply # change} other {Apply # changes}}", "stagedHeading": "Staged for the form", "clearAll": "Clear all", "undo": "Undo {field}", "merged": "merged", "live": "{count, plural, =0 {No changes staged} one {# change staged} other {# changes staged}}" }, "keyboard": { "title": "Keyboard shortcuts", "results": "Previous or next result", "fields": "Move between fields", "toggle": "Keep or use the field", "search": "Edit the search", "close": "Close menus" } }, "writeAndRename": "Write to File & Rename", "writeAndRenameShort": "Write & Rename", "identityCard": "Identity", "catalogCard": "Catalog", "sourceCard": "Source", "score": "Score", "scoreTooltip": "Metadata score {score} out of 100", "emptyFields": "{count, plural, one {empty field} other {empty fields}}", "emptyFieldsCount": "{count, plural, one {# empty field} other {# empty fields}}", "emptyFieldsHeading": "Empty metadata fields", "emptyFieldsTooltip": "Not filled in yet: {fields}. Search online to look them up.", "libraryRow": "Library", "primaryRow": "Primary", "writeBackRow": "Write-back", "writeBackOff": "Off", "lastWrittenRow": "Last written", "neverWritten": "Never", "fileCount": "{count, plural, =0 {no files} one {one file} other {# files}}", "unknownFormat": "Unknown" }, "files": { "title": "Book files", "readAloud": { "action": "Create read-aloud", "loadFailed": "Read-aloud availability couldn't be checked.", "loadFailedAgain": "{count, plural, one {Read-aloud availability still couldn't be checked after # retry.} other {Read-aloud availability still couldn't be checked after # retries.}}", "checkAgain": "Check again", "checking": "Checking…", "reasons": { "worker_unavailable": "The read-aloud worker is offline right now.", "worker_incompatible": "The read-aloud worker needs an update to work with this server.", "book_missing": "Restore this book's missing files to create a read-aloud.", "no_epub": "Add a plain EPUB to this book to create a read-aloud.", "no_epub_existing": "This book already has a read-aloud and no plain EPUB to rebuild it from.", "too_many_audio_files": "This audiobook is split into more files than a read-aloud can be made from.", "epub_not_allowed": "This library doesn't accept EPUB files, so a read-aloud can't be added.", "library_not_mounted": "The read-aloud worker can't reach this library's folder.", "job_active": "A read-aloud is already being created for this book.", "unknown": "A read-aloud can't be created for this book right now." }, "dialog": { "title": "Create a read-aloud", "description": "Matches the narration to the ebook text and adds an EPUB that highlights along with the audio.", "sources": "Sources", "ebook": "Ebook", "ebookHint": "Pick the plain EPUB that matches the narration.", "existing": { "title": "{count, plural, one {This book already has a read-aloud} other {This book already has # read-alouds}}", "replace": "Replace {filename}", "keep": "{count, plural, one {Keep both} other {Keep all of them}}", "keepHint": "The new read-aloud is added as another file.", "replaceHint": "The old file is replaced only after the new one passes its checks, and reading positions carry over.", "replaceNotPermitted": "Replacing a read-aloud needs permission to delete books, so the new one is added as another file.", "generated": "Made by BookOrbit", "imported": "Imported" }, "audio": "Audiobook", "audioSummary": "{count, plural, one {# track} other {# tracks}}, {order, select, book {in book order} other {in your order}}", "audioSummaryWithDuration": "{count, plural, one {# track} other {# tracks}}, {duration}, {order, select, book {in book order} other {in your order}}", "audioSkipped": "{count, plural, one {# track skipped} other {# tracks skipped}}", "changeOrder": "Change order", "restoreOrder": "Restore book order", "trackList": "Tracks in listening order", "trackLabel": "Track {position} of {total}: {name}", "moveUp": "Move {name} up", "moveDown": "Move {name} down", "moved": "{name} moved to position {position} of {total}", "skipped": "Skipped", "noTracks": "Select at least one track.", "language": "Narration language", "chooseLanguage": "Choose a language", "languageUnsupported": "{language} isn't supported by the speech model.", "languageFromBook": "From this book's details.", "languageIsDefault": "Your default language.", "languageSavedAsDefault": "Saved as your default language.", "setDefaultLanguage": "Set as default", "defaultLanguageFailed": "Couldn't save your default language. Try again.", "granularity": "Highlighting", "sentence": "Sentence", "sentenceHint": "Highlights one sentence at a time. Recommended.", "word": "Word", "wordHint": "Highlights each word. Takes longer and makes a larger file.", "experimental": "Experimental", "model": "Speech model: {model}", "estimatedSize": "Estimated size: {size}", "lowDiskLabel": "Low disk space.", "lowDisk": "This needs about {needed} of working space on the worker, which has {free} free.", "processingNote": "Runs in the background. Long audiobooks can take hours, and the first run for a language downloads its model.", "start": "Start", "starting": "Starting…" }, "devices": { "cpu": "Runs on the CPU", "mlx": "Runs on Apple Silicon (MLX)", "cuda": "Runs on an NVIDIA GPU (CUDA)", "webgpu": "Runs on the GPU (WebGPU)", "other": "Runs on {device}" }, "job": { "heading": "Read-aloud", "startedBy": "Started by {name}", "startedByUnknown": "Started by another user", "dismiss": "Dismiss", "details": "Details", "queuedTitle": "Waiting to start", "queueAhead": "{count, plural, =0 {Next in line} one {# job ahead} other {# jobs ahead}}", "elapsed": "Running for {duration}", "justStarted": "Just started", "firstRunForLanguage": "First run for this language", "stoppingTitle": "Stopping…", "stoppingDescription": "Finishing the current step, then it stops. Nothing will be added to this book.", "reviewTitle": "Ready for review", "reviewDescription": "{percent} of the text matched the narration. Check the chapters before adding it.", "reviewDescriptionPlain": "Check the chapters before adding it to this book.", "reviewExpires": "Discarded automatically {when} unless you review it.", "completeTitle": "Read-aloud ready", "completeWarningsTitle": "Read-aloud ready, with warnings", "completeAdded": "Added to this book as a new EPUB.", "completeReplaced": "Replaced the previous read-aloud. Reading positions carry over.", "matchedSentences": "{matched} of {total} {count, plural, one {sentence} other {sentences}} matched the narration", "audioUsed": "{percent} of the audio used", "outsideNarration": "Not in the narration, so left without audio: {chapters}.", "outsideMore": "{count, plural, one {# more chapter} other {# more chapters}}", "chaptersHeading": "Chapters", "activityHeading": "Activity", "failedTitle": "Read-aloud failed", "retryUntil": "Retry continues from the last finished step until {date}.", "cancelledTitle": "Generation cancelled", "discardedTitle": "Output discarded", "nothingAdded": "Nothing was added to this book.", "expiredDescription": "It wasn't reviewed within 14 days, so nothing was added to this book.", "progress": "Read-aloud progress", "steps": "Steps", "stepDone": "{step}, done", "stepCurrent": "{step}, in progress", "stepUpcoming": "{step}, not started", "openReadAlong": "Open read-aloud", "showFile": "Show file", "retry": "Retry", "startOver": "Start over", "cancel": "Cancel generation", "cancelPrompt": "Cancel generation?", "keepRunning": "Keep running", "warnings": "Warnings", "live": "Read-aloud: {status}" }, "stageDetail": { "file": "File {current} of {total}", "track": "Track {current} of {total}", "chapter": "Chapter {current} of {total}", "step": "Step {current} of {total}" }, "stages": { "queued": "Waiting to start", "preparing_audio": "Preparing the audio", "downloading_model": "Downloading the speech model", "generating_emissions": "Listening to the narration", "marking_up_ebook": "Marking up the ebook text", "aligning": "Matching the text to the narration", "validating": "Checking the result", "awaiting_review": "Waiting for review", "publishing": "Adding the read-aloud to this book", "completed": "Done", "working": "Working" }, "steps": { "audio": "Audio", "speech": "Speech", "text": "Text", "align": "Align", "check": "Check", "publish": "Publish" }, "review": { "heading": "Chapters", "summary": "{count, plural, one {# chapter} other {# chapters}}, {attention, plural, =0 {none need a look} one {# needs a look} other {# need a look}}", "chapter": "Chapter", "part": "Part", "statusLabel": "Status", "status": { "aligned": "Aligned", "notFound": "Not found in the audio", "tooShort": "Too short to match", "excluded": "Excluded", "audioOnly": "Audio only", "outside": "Not in the narration", "unknown": "Unknown" }, "matched": "Matched", "matchedValue": "{percent} matched", "zones": { "front": "Front matter", "body": "Body", "back": "Back matter" }, "include": "Include {title}", "showText": "Show text from {title}", "hideText": "Hide text from {title}", "preview": "Preview", "firstMatch": "First match", "lastMatch": "Last match", "noText": "No text to show for this chapter.", "noReport": "No chapter report was kept for this job. Run it again to see one.", "loading": "Loading chapters…", "loadFailed": "The chapter report couldn't be loaded.", "tryAgain": "Try again", "pending": "{count, plural, one {# change is not applied yet.} other {# changes are not applied yet.}} Re-sync reruns only the matching step.", "resync": "Re-sync", "publishAnyway": "Publish anyway", "discard": "Discard", "discardPrompt": "Discard this output?", "keep": "Keep it" }, "log": { "heading": "Activity", "empty": "No activity yet.", "loading": "Loading activity…", "loadFailed": "The activity log couldn't be loaded.", "tryAgain": "Try again", "warn": "Warning", "error": "Error", "other": "Worker activity", "events": { "job_created": "Job created", "claimed": "Sent to the worker", "job_accepted": "The worker accepted the job", "disk_checked": "Enough free space on the worker", "disk_check_failed": "Not enough free space on the worker", "stage_started": "Started", "stage_finished": "Finished in {duration}", "stage_finished_plain": "Finished", "stage_skipped": "Reused earlier work", "stage_failed": "This step failed", "model_download_started": "Downloading the speech model for this language", "model_download_finished": "Speech model downloaded", "emissions_cached": "Reused speech analysis from an earlier run", "audio_reencoded_cbr": "Converted variable-bitrate MP3 for accurate timing", "stalign_warning": "The aligner reported a warning", "waiting_for_worker": "Waiting for the worker to respond", "worker_reachable_again": "The worker is responding again", "worker_lost_job": "The worker restarted; resuming from earlier work", "requeued": "Will try again shortly", "recovered": "Resuming after a server restart", "output_validated": "Checked the result", "needs_review": "Needs review: part of the text didn't match the audio", "publish_requested": "Adding to the book", "published": "Added to the book", "file_added": "Saved as a new file", "file_replaced": "Replaced the existing read-aloud", "file_already_attached": "The book already had this file", "replace_target_missing": "The read-aloud to replace was gone, so a new file was added", "replace_not_permitted": "Replacing the read-aloud was no longer permitted, so a new file was added", "job_completed": "The worker finished", "cancel_requested": "Cancellation requested", "runner_killed": "Stopped the worker process", "job_cancelled": "The worker stopped", "cancelled": "Cancelled", "discarded": "Discarded at review", "job_failed": "The worker reported a failure", "retry_requested": "Retry requested", "resync_requested": "Re-sync requested", "review_reminder_sent": "Reminder sent: the review expires soon", "review_expired": "Discarded after 14 days without review" } }, "warnings": { "unaligned_tracks": "One or more audio tracks could not be aligned.", "unmatched_text": "A noticeable amount of ebook text was not matched to narration.", "interpolated_text": "Some text timing was estimated between confident matches.", "dropped_text": "Some ebook text was omitted from the synchronized sequence." }, "errors": { "create": "The read-aloud couldn't be started. Try again.", "createInvalid": "Some selected files are no longer on this book. Check the selection and try again.", "createConflict": "Another read-aloud is already being created for this book.", "createUnavailable": "The read-aloud worker is offline. Try again later.", "forbidden": "You don't have permission to do that.", "gone": "This job no longer exists.", "conflict": "This job had already moved on. It now shows where it is.", "cancel": "The job couldn't be cancelled. Try again.", "publish": "The read-aloud couldn't be added to this book. Try again.", "retry": "The job couldn't be retried. Try again.", "resync": "The re-sync couldn't be started. Try again.", "dismiss": "The card couldn't be dismissed. Try again.", "job": { "worker_unavailable": "The read-aloud worker couldn't be reached.", "worker_incompatible": "The read-aloud worker needs an update to work with this server.", "worker_crashed": "The read-aloud worker stopped unexpectedly.", "library_not_mounted": "The read-aloud worker can't reach this library's folder.", "source_missing": "A selected file is no longer available.", "source_changed": "A selected file changed after the job started.", "invalid_source": "The selected EPUB or audiobook couldn't be read.", "unsupported_language": "The speech model doesn't support the selected language.", "insufficient_storage": "There isn't enough free disk space to finish.", "audio_processing_failed": "The audiobook couldn't be prepared.", "model_download_failed": "The speech model couldn't be downloaded.", "inference_failed": "Speech recognition failed while listening to the narration.", "markup_failed": "The ebook text couldn't be prepared for matching.", "alignment_failed": "The text couldn't be matched to the narration.", "invalid_output": "The generated EPUB failed its checks.", "publication_failed": "The generated EPUB couldn't be added to this book.", "review_expired": "It wasn't reviewed within 14 days.", "discarded": "The read-aloud was discarded at review.", "cancelled": "The job was cancelled.", "unknown": "Something went wrong while creating the read-aloud." } } }, "stats": { "files": "Files", "total": "Total", "runtime": "Runtime", "formats": "Formats" }, "filesHeading": "Files", "allPresent": "All present", "groupedByReader": "grouped by reader", "thisFile": "This file", "writeBackShort": "Write-back", "fieldsSet": "{filled} / {total} set", "writtenSummary": "{fields} and {count, plural, one {# more field} other {# more fields}} are written into the {format}.", "writtenSummaryAll": "{fields} are written into the {format}.", "writtenNothing": "None of the {total} writable fields have a value yet.", "writeBackOff": "Write-back is off for this book.", "editMetadata": "Edit metadata", "showAllTracks": "Show all", "collapseTracks": "Collapse", "moreTracks": "{count, plural, one {# more track} other {# more tracks}}", "tracksRolled": "{count, plural, one {# track} other {# tracks}}", "fileDetails": "File details", "openDetails": "Open file details", "closeDetails": "Close file details", "trackFrom": "Track {track} of {total}, from {time}", "throughCopy": "You are {percent} through this copy", "fileCount": "{count, plural, =0 {no files} one {# file} other {# files}}", "synced": "Synced {time}", "sortAria": "Sort files", "syncHistory": "Sync history", "metadataWriteBack": "Metadata write-back", "relative": { "seconds": "{value}s ago", "minutes": "{value}m ago", "hours": "{value}h ago", "days": "{value}d ago" }, "renameFailed": "Failed to rename file", "deleteFailed": "Failed to delete file", "addFile": "Add File", "lastSynced": "Last synced: {time}", "sort": { "label": "Sort:", "name": "Name", "format": "Format", "size": "Size", "date": "Date" }, "hidePaths": "Hide paths", "showPaths": "Show paths", "hideLog": "Hide log", "viewSyncLog": "View sync log", "noWriteHistory": "No write history yet.", "fieldsWritten": "{count, plural, =0 {no fields} one {one field} other {# fields}}", "track": "Track {number}", "primary": "Primary", "read": "Read", "play": "Play", "peek": "Peek", "download": "Download", "moreActions": "More actions", "rename": "Rename", "empty": { "title": "No files attached", "description": "This book has no associated files." }, "renameModal": { "title": "Rename File", "description": "Rename the physical file on disk.", "placeholder": "New filename" }, "saving": "Saving...", "deleteModal": { "title": "Delete file?", "description": "Are you sure you want to delete \"{filename}\"? This action cannot be undone." }, "deleting": "Deleting...", "folderAria": "Folder location", "folderContents": "Folder contents", "inspectorAria": "Selected file", "libraryRoot": "library root", "onDisk": "On disk", "missing": "Missing", "backToFolder": "Back to folder", "copyPath": "Copy full path", "pathCopied": "Path copied to clipboard", "resume": "Resume", "audiobook": "Audiobook", "writeTarget": "Write target", "notWritten": { "formatNotSupported": "Not written: unsupported format", "formatDisabled": "Not written: format turned off", "fileExceedsSizeLimit": "Not written: over size limit", "notContentFile": "Not written: not book content" }, "enabled": "Enabled", "disabled": "Off", "notSet": "not set", "sortAdded": "Added", "formatCount": "{count, plural, one {# format} other {# formats}}", "trackCount": "{count, plural, one {# track} other {# tracks}}", "formatsInFolder": "{count, plural, one {# format here} other {# formats here}}", "compositionAria": "Share of folder size by format", "percentRead": "{percent} read", "trackOf": "Track {track} of {total}", "groups": { "ebook": "Ebook", "document": "Document", "comic": "Comic", "audio": "Audio", "extras": "Extras" }, "roles": { "primary": "Primary", "content": "Alternate", "supplement": "Supplement", "cover": "Cover" }, "reader": { "none": "No reader", "ebook": "Ebook reader", "document": "PDF reader", "comic": "Comic reader", "audio": "Audio player" }, "spec": { "format": "Format", "role": "Role", "size": "Size", "length": "Length", "added": "Added", "indexed": "Indexed", "opensIn": "Opens in", "writeBack": "Write-back", "track": "Track", "targetFile": "Target file", "notWritten": "Not written" }, "duration": { "hoursMinutes": "{hours}h {minutes}m", "minutes": "{minutes}m", "minutesSeconds": "{minutes}m {seconds}s", "seconds": "{seconds}s" }, "positionHeading": "Your position in this copy", "copiesStarted": "{started} of {total} copies started", "nothingStarted": "Nothing started yet", "throughFile": "{percent} through this file", "notOpened": "Not opened yet", "lastRead": "Last read {time}", "noPosition": "No reading position stored", "trackPositionHeading": "Where this track sits", "totalRuntime": "{duration} total", "startsAt": "Starts at {time}", "trackLength": "{duration} long", "switchFileHeading": "Switch file", "writeBackHeading": "Written into this file", "fieldsWithValue": "{filled} of {total} fields have a value", "lastRun": "Last run {time}", "neverRun": "Never run", "historyHeading": "History", "timeline": { "written": "Metadata written to {format}", "writtenMany": "Metadata written to {format} ×{count}", "writeDetail": "{count, plural, one {# field} other {# fields}} · {ms}ms · {trigger}", "failed": "Write failed", "indexed": "{name} indexed", "indexedMany": "{count} {format} files indexed" } }, "chapters": { "heading": "Chapters", "untitled": "Untitled book", "untitledChapter": "Untitled chapter", "edit": "Edit chapters", "done": "Done", "protected": "Protected", "unprotected": "Not protected", "protectedHint": "Rescans and metadata refreshes leave these chapters alone.", "unprotectedHint": "A rescan or a metadata refresh can replace these chapters.", "stats": { "chapters": "Chapters", "runtime": "Runtime", "average": "Average" }, "source": { "embedded": "Read from the audio files", "tracks": "One chapter per audio file, not saved", "provider": "From fetched metadata", "migration": "Imported from Audiobookshelf", "manual": "Edited in BookOrbit", "manualBy": "Edited by {name} {when}", "readAlong": "From the read-along narration in the EPUB, view only", "none": "No chapters yet" }, "youAreHere": "You are here", "playFrom": "Listen from {title}", "openInReader": "Open {title} in the reader", "selectRow": "Select chapter {index}", "selectedCount": "{count, plural, one {# selected} other {# selected}}", "selectAll": "Select all", "selectNone": "Select none", "removeSelected": "Remove selected", "startOf": "Start of chapter {index}", "titleOf": "Title of chapter {index}", "titlePlaceholder": "Chapter title", "retryOperation": "Retry chapter operation", "operationProgress": "Chapter operation in progress: {done} of {total} files processed.", "createFirst": "Add first chapter", "newChapter": "New chapter", "undo": "Undo", "redo": "Redo", "find": "Find chapters", "toolsMenu": "Tools", "export": "Export", "saved": "Chapters saved", "reload": "Reload", "retry": "Try again", "nudge": { "backSecond": "Move the start back one second", "backTenth": "Move the start back a tenth of a second", "forwardTenth": "Move the start forward a tenth of a second", "forwardSecond": "Move the start forward one second" }, "issues": { "emptyTitle": "This chapter needs a title.", "firstNotZero": "The first chapter has to start at 0:00.", "notAscending": "This chapter starts at the same time as the one before it.", "pastEnd": "This chapter starts after the audiobook ends.", "tooShort": "This chapter is under a second long." }, "player": { "scrubber": "Preview position", "play": "Play preview", "pause": "Pause preview", "back": "Back 15 seconds", "forward": "Forward 15 seconds" }, "history": { "heading": "History", "empty": "Saved versions appear here.", "by": "{source} by {name}", "facts": "{when}: {count, plural, one {# chapter} other {# chapters}}", "source": { "embedded": "From the audio files", "tracks": "One per audio file", "provider": "From fetched metadata", "migration": "From Audiobookshelf", "manual": "Edited" } }, "revert": { "action": "Revert to the files' chapters", "title": "Revert to the chapters in the files?", "description": "BookOrbit reads the chapters embedded in the audio files again and stops protecting them from rescans. Unsaved edits are lost. The current list stays in the history.", "confirm": "Revert", "done": "Chapters reverted to the audio files" }, "discardDialog": { "title": "Discard chapter edits?", "description": "Your changes to the chapters have not been saved.", "confirm": "Discard" }, "save": { "action": "Save chapters", "discard": "Discard", "lock": "Protect from rescans", "lockHint": "Keep these chapters when the files are rescanned or metadata is refreshed.", "unsaved": "Unsaved changes", "unsavedWithWarnings": "{count, plural, one {Unsaved changes, # warning} other {Unsaved changes, # warnings}}", "blocked": "{count, plural, one {Fix # problem to save} other {Fix # problems to save}}", "upToDate": "All changes saved", "short": "Save" }, "writeFiles": { "more": "More save options", "saveAndWrite": "Save and write to files", "writeSaved": "Write saved chapters to files", "writing": "Writing chapters into the audio files...", "confirmTitle": "Write chapters into the audio files?", "confirmDescription": "{count, plural, one {This rewrites the book's audio file with these chapters.} other {This rewrites the book's # audio files with these chapters.}} The audio itself is copied unchanged. Anyone streaming the book right now may need to restart it, and phones that already downloaded it keep their copy until it is downloaded again.", "confirm": "Write to files", "done": "{count, plural, one {Chapters written into the audio file.} other {Chapters written into all # audio files.}}", "partial": "Chapters were written into {written} of {total} files. The rest were left as they were.", "reasons": { "libraryDisabled": "Writing to files is off for this library. Turn it on in the library's settings.", "noFiles": "This book has no audio files to write to.", "formatNotSupported": "These audio files cannot hold chapters. Only M4B, M4A and MP3 can.", "formatDisabled": "Writing to audio files is turned off for this library.", "tooLarge": "A file is larger than this library's limit for writing to files." } }, "formats": { "cue": "CUE sheet", "ffmetadata": "FFmpeg metadata", "audacity": "Audacity labels", "timestamps": "Timestamped text", "titles": "List of titles", "json": "JSON" }, "apply": { "label": "How to use these chapters", "action": "Apply to editor", "replace": "Replace all", "replaceHint": "Use these chapters, titles and times.", "titles": "Titles only", "titlesHint": "Keep your start times and take the titles of matching rows.", "times": "Start times only", "timesHint": "Keep your titles and take the start times of matching rows." }, "sources": { "description": "Compare them with the list you are editing, then choose what to take.", "loading": "Reading chapters...", "counts": "{incoming, plural, one {# incoming chapter} other {# incoming chapters}}, {current, plural, one {# in the editor} other {# in the editor}}", "pastEnd": "{count, plural, one {# chapter starts after your audiobook ends.} other {# chapters start after your audiobook ends.}}", "currentColumn": "In the editor", "incomingColumn": "Incoming", "deltaColumn": "Shift (s)", "applied": "Applied to the editor. Save to keep it.", "empty": "No chapters were found here.", "files": { "menu": "From the audio files", "title": "Chapters in the audio files" }, "tracks": { "menu": "One per audio file", "title": "One chapter per audio file" }, "lookup": { "menu": "From Audible...", "title": "Chapters from Audible", "asin": "ASIN", "region": "Store", "action": "Look up", "hint": "Audible's chapters for that edition. Its timings come from Audible's own recording, so they may need an offset or a stretch to line up with your files." }, "toc": { "menu": "From the ebook's contents", "title": "Titles from the ebook" }, "readAlong": { "menu": "From the read-along EPUB", "title": "Chapters from the read-along" }, "import": { "menu": "Import...", "title": "Import chapters", "pasteLabel": "Paste chapters", "placeholder": "00:00:00 Opening Credits\n00:00:14 Dedication\n00:00:23 Chapter 1", "formats": "Reads CUE sheets, FFmpeg metadata, Audacity labels, Audiobookshelf JSON, timestamped lines, or a plain list of titles.", "read": "Read chapters", "chooseFile": "Choose a file", "unreadable": "No chapters could be read from that.", "tooLarge": "That file is too large to be a chapter list.", "skipped": "{count, plural, one {# line skipped} other {# lines skipped}}", "truncated": "Only the first {count} chapters were read." }, "version": { "title": "Saved version", "detail": "Saved {when}", "detailBy": "Saved {when} by {name}" } }, "review": { "adjust": "Line up the times", "runtimes": "Source runtime {theirs}, this audiobook {ours} ({difference} s)", "accurate": "Audible marks these timings as exact", "offset": "Offset (s)", "suggestIntro": "Skip Audible's intro ({seconds} s)", "suggestMatch": "Match the first chapters ({seconds} s)", "fitPauses": "Fit to pauses", "fitPausesResult": "Fit to pauses ({seconds} s, {hits} of {total})", "fitPausesNone": "No single offset lines these chapters up with pauses in your audio.", "resetOffset": "Reset", "stretch": "Stretch to fit this audiobook", "stretchHint": "Scales every start time by {factor}, which moves the last chapter by {seconds} s.", "parts": "Part headings", "partsOwn": "Keep as chapters", "partsPrefix": "Add to chapter titles", "partsDrop": "Leave out", "match": "Match rows", "matchTime": "By start time", "matchPosition": "In order", "matched": "{count, plural, one {# row matched} other {# rows matched}}", "include": "Include", "includeRow": "Include {title}", "willReplace": "{count, plural, one {Replaces the list with # chapter} other {Replaces the list with # chapters}}", "willChange": "{count, plural, =0 {Nothing would change} one {# chapter changes} other {# chapters change}}" }, "tools": { "apply": "Apply", "changes": "{count, plural, =0 {Nothing would change.} one {# chapter will change.} other {# chapters will change.}}", "scope": { "label": "Apply to", "all": "{count, plural, one {The # chapter} other {All # chapters}}", "selected": "{count, plural, one {The # selected chapter} other {The # selected chapters}}", "fromActive": "Chapter {index} to the end" }, "shift": { "title": "Shift times", "description": "Move chapter starts earlier or later by the same amount. A chapter at 0:00 stays there.", "amount": "Seconds", "hint": "Negative moves chapters earlier. Use this when a release has a longer or shorter intro.", "invalid": "Enter a number of seconds, such as 4.04 or -2." }, "renumber": { "title": "Renumber titles", "description": "Give chapters numbered titles in order.", "pattern": "Title pattern", "hint": "{'{n}'} is replaced by the number.", "defaultPattern": "Chapter {'{n}'}", "start": "First number", "invalid": "Enter a non-negative whole starting number and padding from 0 to 4.", "padding": "Digits" }, "replace": { "title": "Find and replace", "description": "Change text in chapter titles.", "find": "Find", "with": "Replace with", "regex": "Regular expression", "caseSensitive": "Match case", "invalidPattern": "That regular expression is not valid." }, "mergeShort": { "title": "Merge short chapters", "description": "Fold chapters shorter than a length into the chapter before them.", "threshold": "Shorter than (seconds)", "invalid": "Enter a number of seconds above 0." }, "clean": { "title": "Clean up titles", "nothing": "Titles are already clean.", "done": "{count, plural, one {Cleaned # title} other {Cleaned # titles}}" } }, "snap": { "menu": "Snap to pauses...", "title": "Snap to pauses", "description": "Move chapter starts onto the nearest pause in the audio, where the narrator stops between chapters.", "radius": "Look for a pause", "radiusOption": "Within {seconds} s either side", "placement": "Place each start", "placementEnd": "Just before the narrator speaks again", "placementMiddle": "In the middle of the pause", "progressive": "Carry each correction forward", "progressiveHint": "For timings that drift further off as the book goes on: each move also shifts where the next start is looked for.", "run": "Find pauses", "running": "Listening for pauses: {done} of {total}", "progressLabel": "Pause search progress", "stop": "Stop", "back": "Change options", "moved": "{count, plural, one {# chapter moves, by {average} s} other {# chapters move, by {average} s on average and {largest} s at most}}", "nothing": "No chapter needs to move.", "notFound": "{count, plural, one {# found no pause nearby} other {# found no pause nearby}}", "blocked": "{count, plural, one {# stays put to keep the chapters in order} other {# stay put to keep the chapters in order}}", "failed": "{count, plural, one {# could not be heard: its audio did not decode} other {# could not be heard: their audio did not decode}}", "movedOne": "Moved to the pause at {time} ({delta} s).", "notFoundOne": "No pause within {seconds} s of this start.", "blockedOne": "The nearest pause would put this chapter out of order.", "alreadyThere": "This start already sits on a pause." }, "waveform": { "label": "Chapter start in the audio", "loading": "Loading the audio around this start...", "failed": "The audio here could not be drawn." }, "errors": { "operation": "The chapter operation could not complete. Retry to reconnect or check its status.", "load": "Chapters could not be loaded.", "save": "Chapters could not be saved.", "revert": "Chapters could not be reverted.", "readFiles": "The audio files could not be read.", "lookup": "Audible could not be asked for chapters.", "readEbook": "The ebook could not be read.", "analyze": "The audio could not be analyzed.", "writeFiles": "The chapters could not be written into the files.", "versions": "The chapter history could not be loaded.", "preview": "The preview could not start.", "stale": "Someone else changed these chapters. Reload to see their version; your edits are kept until you do." }, "addCutTooClose": "Move the playhead at least a second away from a cut first.", "columns": { "chapter": "Chapter", "inBook": "In the book", "starts": "Starts", "length": "Length", "start": "Start", "title": "Title" }, "listen": { "resume": "Resume", "start": "Listen", "progress": "{left} left in chapter · {percent} of the book", "notStarted": "Not started", "left": "{time} left" }, "timeline": { "label": "Chapters across the book", "listened": "{percent} of the book listened" }, "cut": { "heading": "Cut", "label": "Cut between {previous} and {next}", "firstHeading": "Start of the book", "count": "{index} of {total}", "previous": "Previous cut", "next": "Next cut", "ends": "Ends", "starts": "Starts", "saved": "saved", "backToCut": "Back to the cut", "move": "Move the cut", "playCut": "Play across the cut", "playCutHint": "Play a few seconds either side of the cut (P)", "stop": "Stop", "stopHint": "Stop playing (P)", "snap": "Snap to pause", "onPause": "On a pause", "noPause": "{seconds, plural, one {No pause within # second} other {No pause within # seconds}}", "remove": "Remove cut", "removeHint": "{title} joins {previous}", "first": "The first chapter always starts at 0:00, so it has no cut to move. Pick any other chapter to adjust where it begins.", "announce": "Cut at {time}", "moveHere": "Move cut here", "moveHereHint": "Move this cut to {time} (M)", "moveHereOutside": "Put the playhead inside {previous} or {title} to move this cut there.", "newChapterHere": "New chapter here", "newChapterHereHint": "Start a new chapter at {time}" } }, "highlights": { "note": { "placeholder": "Add a note...", "saving": "Saving" }, "export": { "trigger": "Export", "plainText": "Plain Text", "page": "Export page", "selected": "Export selected" }, "sort": { "position": "Position", "newest": "Newest first", "oldest": "Oldest first" }, "summary": { "highlights": "{count, plural, =0 {no highlights} one {one highlight} other {# highlights}}", "notes": "{count, plural, =0 {no notes} one {one note} other {# notes}}", "chapters": "{count, plural, =0 {no chapters} one {one chapter} other {# chapters}}" }, "filterByChapter": "Filter by chapter", "allChapters": "All chapters", "untitled": "Untitled", "trash": "Trash", "empty": { "noMatch": "No highlights match your filters.", "resetFilters": "Reset filters", "none": "No highlights yet", "hint": "Select text while reading to create highlights" }, "uncategorized": "Uncategorized", "paginationUnit": "highlights", "rail": { "title": "Marks", "unit": "{count, plural, one {highlight} other {highlights}}", "withNotes": "carry a note", "chaptersMarked": "chapters marked", "ofChaptersMarked": "of {total} chapters marked", "colour": "Colour", "showOnly": "Show only {colour}", "source": "Where they came from", "health": "Position health", "needsAttention": "{count, plural, one {# needs attention} other {# need attention}}", "anchorLost": "{count, plural, one {one lost its anchor when the file changed} other {# lost their anchor when the file changed}}", "reAnchored": "{count, plural, one {one was re-anchored automatically} other {# were re-anchored automatically}}", "reviewPositions": "Review positions", "span": "Span", "firstMark": "First mark", "lastMark": "Last mark", "markingDays": "Marking days", "exportCount": "Export {count}" }, "row": { "select": "Select this highlight", "showMore": "Show more", "showLess": "Show less", "note": "Note", "addNote": "Add a note", "page": "p.{page}", "anchorLost": "Anchor lost", "reAnchored": "Re-anchored" }, "stream": { "title": "The stream", "searchPlaceholder": "Search {count} highlights and notes", "all": "All", "notes": "Notes", "review": "Review", "density": "Switch between comfortable and compact rows", "matchCount": "{shown} of {total} match", "textChip": "text “{query}”", "marks": "{count, plural, one {# mark} other {# marks}}", "loadingMore": "Loading more" }, "bulk": { "selected": "{count} selected", "selectAll": "Select all {count}", "recolour": "Recolour the selection", "recolourTo": "Recolour to {colour}", "clear": "Clear the selection" }, "index": { "title": "Index", "groupBy": "Group the stream by", "byChapter": "Chapters", "byColour": "Colours", "byDay": "Days" }, "activity": { "title": "Marking activity", "days": "{count, plural, one {# day} other {# days}}", "showAll": "Show all {count} days", "showFewer": "Show fewer" }, "inspector": { "title": "Highlight detail", "back": "Back to the index", "counter": "Mark {position} of {total}", "previous": "Previous mark", "next": "Next mark", "notePrompt": "Why did this one matter? Notes are searchable and travel with the export.", "style": "Style", "position": "Position and sync", "openHere": "Open here" }, "band": { "title": "Where the marks are", "subtitle": "every marked chapter in reading order, coloured as you marked it", "barTitle": "{chapter}, {count} marks", "start": "Start", "densest": "Densest", "marks": "{count, plural, one {# mark} other {# marks}}", "longestGap": "Longest run without a mark", "chapters": "{count, plural, one {# chapter} other {# chapters}}", "end": "End" }, "emptyStage": { "title": "No highlights in {title} yet", "body": "Highlights arrive from three places, and this page collects all of them in one spine.", "openReader": "Open the reader", "web": { "title": "Read it here", "body": "Select text in the built-in reader and pick a colour." }, "kobo": { "title": "Sync a Kobo", "body": "Highlights made on the device come across on the next sync." }, "koreader": { "title": "Sync KOReader", "body": "The plugin uploads annotations with their exact positions." } }, "shortcuts": { "title": "Keyboard", "description": "Keyboard shortcuts for the highlights list.", "move": "Next / previous mark", "open": "Open the inspector", "back": "Back to the index", "search": "Search", "note": "Write a note", "recolour": "Recolour", "select": "Select this mark", "regroup": "Regroup the stream", "copy": "Copy the quote", "reader": "Open in the reader" }, "railTitle": "{marks} marks · {chapters} chapters", "whenMarked": "When they were marked", "chapters": "Chapters", "noChapter": "No chapter", "views": { "position": "In reading order", "newest": "Newest first", "oldest": "Oldest first", "colour": "By colour", "source": "By source" } }, "readingLog": { "resetReadingState": "Reset reading state", "vitals": { "aria": "Reading summary", "notSet": "Not set", "started": "Started", "finished": "Finished", "editStarted": "Edit the date you started this book", "editFinished": "Edit the date you finished this book", "totalTime": "Total time", "sessions": "Sessions", "avgSession": "Average session", "activeDays": "Active days", "activeDaysOf": "{active} of {total}", "pace": "Pace", "pacePerHour": "{percent}%/h", "lastRead": "Last read", "whereYouRead": "Where you read it", "addSession": "Add session", "durationHm": "{hours}h {minutes}m", "durationM": "{minutes}m", "durationS": "{seconds}s" }, "ledger": { "title": "Sessions", "none": "none", "colDay": "Day", "colTime": "Time", "colLength": "Length", "colChange": "Change", "colPosition": "Position in book", "colReached": "Reached", "colSource": "Source", "colFormat": "Format", "gapDays": "{count, plural, one {# day without reading} other {# days without reading}}", "attemptBegan": "Attempt {index} began", "attemptOutsideAny": "Outside any attempt", "empty": "No sessions recorded yet", "emptyHint": "Open the book in the reader, sync a device, or add a session by hand." }, "attempts": { "title": "Attempts", "none": "none", "ordinal": "Attempt {index}", "addPast": "Add a past attempt", "reread": "Reread", "rereadPrompt": "Start a new reading attempt?", "rereadResetProgress": "Reset the reading position to the beginning. Synchronized devices may receive this reset.", "rereadConfirm": "Start reread", "fieldStarted": "Started", "fieldEnded": "Ended", "fieldOutcome": "Outcome", "outcome": { "completed": "Completed", "skimmed": "Skimmed", "abandoned": "Abandoned", "inProgress": "In progress" }, "spanRange": "{from} to {to}", "spanSince": "since {from}", "spanEnded": "ended {to}", "spanUnknown": "No dates recorded", "sessionCount": "{count, plural, one {# session} other {# sessions}}", "endBeforeStart": "The end date must be on or after the start date.", "editAria": "Edit this attempt", "deleteAria": "Delete this attempt", "cancelDeleteAria": "Cancel deleting this attempt", "confirmDeleteAria": "Confirm deleting this attempt", "empty": "No attempts recorded", "emptyHint": "Start a reread, or add an attempt you finished before this library existed." }, "records": { "title": "Records", "longestSession": "Longest session", "bestDay": "Best day", "longestStreak": "Longest streak", "streakDays": "{count, plural, one {# day} other {# days}}", "pace": "Reading pace", "jumpedBack": "Jumped back", "jumpedBackTimes": "{count, plural, one {# time} other {# times}}", "firstOpened": "First opened", "empty": "Records appear once this book has sessions." }, "band": { "curve": "Curve", "trace": "Trace", "switchAria": "Chart view", "curveTitle": "Progress over time", "traceTitle": "Where you were in the book", "curveSubDays": "{active} active days across {total}", "curveSubSitting": "one sitting, session by session", "traceSub": "each bar is the stretch one session covered", "traceSubWithBacktracks": "{count, plural, one {each bar is one session, # jumped back} other {each bar is one session, # jumped back}}", "legendPosition": "Position reached", "legendMinutes": "Minutes read", "legendBacktrack": "Jumped back", "traceEmpty": "No trace yet", "traceEmptyHint": "Once sessions exist this shows the stretch of the book each one covered, and where you doubled back.", "tooltipCovered": "Covered {from}% to {to}%", "tooltipMinutes": "{minutes} min" }, "emptyStage": { "title": "Nothing logged for this book yet", "description": "A reading log is built from sessions. BookOrbit records one every time you read in the web reader, and picks up the rest from the devices you sync.", "readerTitle": "Read it here", "readerBody": "Every minute in the BookOrbit reader is logged automatically.", "koreaderTitle": "Sync KOReader", "koreaderBody": "The plugin pushes each sitting back, with the page you reached.", "koboTitle": "Sync a Kobo", "koboBody": "Plug the device in and BookOrbit reads its own reading-time counter.", "addSession": "Add a session by hand", "recordPast": "Record a past reading" }, "moreActionsAria": "More reading log actions", "export": { "button": "Export" }, "weekdays": { "sun": "Sun", "mon": "Mon", "tue": "Tue", "wed": "Wed", "thu": "Thu", "fri": "Fri", "sat": "Sat" }, "months": { "jan": "Jan", "feb": "Feb", "mar": "Mar", "apr": "Apr", "may": "May", "jun": "Jun", "jul": "Jul", "aug": "Aug", "sep": "Sep", "oct": "Oct", "nov": "Nov", "dec": "Dec" }, "heatmap": { "minutesUnit": "min", "title": "Activity", "empty": "No reading activity in this window.", "emptyHint": "Sessions recorded here will build your consistency view." }, "hero": { "summaryAria": "Reading summary", "notSet": "Not set", "relative": { "seconds": "{count}s ago", "minutes": "{count}m ago", "hours": "{count}h ago", "days": "{count}d ago", "months": "{count, plural, =0 {# month ago} one {# month ago} other {# months ago}}", "years": "{count, plural, =0 {# year ago} one {# year ago} other {# years ago}}" }, "noSessions": "No sessions", "dateErrors": { "startFuture": "Start date cannot be in the future.", "finishFuture": "Finish date cannot be in the future.", "finishBeforeStart": "Finish date must be on or after the start date.", "finishBeforeStartWithDate": "Finish date must be on or after the start date ({date}).", "saveFailed": "Failed to save reading dates." }, "eta": { "max": "99h+ to finish", "minutes": "~{m}m to finish", "hours": "~{h}h to finish", "hoursMinutes": "~{h}h {m}m to finish" }, "momentum": { "none": "No activity in the last two weeks", "new": "New activity this week", "up": "+{pct}% vs previous 7 days", "down": "{pct}% vs previous 7 days", "flat": "Unchanged vs previous 7 days" }, "stats": { "totalTime": "Total Time", "sessions": "Sessions", "avgSession": "Avg Session", "lastRead": "Last Read" }, "firstRead": "First Read", "lastRead": "Last Read", "dateStarted": "Date Started", "dateFinished": "Date Finished", "addSession": "Add session" }, "journey": { "tooltipProgress": "Progress", "tooltipReading": "Reading", "minutesUnit": "min", "title": "Progress journey", "empty": "No progress data in this window.", "emptyHint": "Progress will appear after a session records a reading position." }, "sourceSplit": { "title": "Reading sources", "shortTitle": "Sources" }, "untitled": "Untitled", "addSessionFailed": "Failed to add session", "filters": { "show": "Show", "dateRangeAria": "Reading session date range", "allTime": "All time", "last30": "Last 30 days", "last90": "Last 90 days", "thisYear": "This year", "allFormats": "All formats" }, "table": { "title": "Sessions", "sourceWeb": "Web", "sourceIos": "iOS app", "sourceWatchos": "Apple Watch", "sourceManual": "Manual", "colDate": "Date", "colDateMobile": "Date", "colDuration": "Duration", "colDurationMobile": "Duration", "colProgressChange": "Progress Change", "colProgressChangeMobile": "Delta", "colEndProgress": "End Progress", "colEndProgressMobile": "End", "jumpToProgress": "Jump to {progress}%", "empty": "No reading sessions recorded yet.", "emptyHint": "Add a session to start building this book's reading history.", "colPace": "Pace", "colSource": "Source", "colFormatMobile": "Fmt", "colFormat": "Format", "cancelDelete": "Cancel delete", "cancelDeleteAria": "Cancel delete session", "confirmDeleteTitle": "Click again to confirm delete", "confirmDeleteAria": "Confirm delete session", "deleteAria": "Delete session", "loadMore": "Load more", "showing": "Showing {shown} of {total} sessions" } }, "richDescription": { "linkProtocolError": "Use http, https, or mailto.", "bold": "Bold", "italic": "Italic", "underline": "Underline", "strikethrough": "Strikethrough", "bulletList": "Bullet list", "numberedList": "Numbered list", "outdentAria": "Outdent list item", "outdent": "Outdent", "indentAria": "Indent list item", "indent": "Indent", "quote": "Quote", "editLink": "Edit link", "link": "Link", "removeLink": "Remove link", "undo": "Undo", "redo": "Redo", "clearFormatting": "Clear formatting", "previewDescription": "Preview description", "preview": "Preview", "linkUrlLabel": "Link URL", "applyLink": "Apply link", "apply": "Apply", "cancelLink": "Cancel link", "noDescription": "No description available." }, "seriesMembership": { "addSeries": "Add series", "seriesPlaceholder": "Series", "moveUp": "Move up", "moveDown": "Move down", "removeSeries": "Remove series", "seriesIndexLabel": "Position in series", "invalidSeriesIndex": "Enter digits with at most one decimal point, such as 5.10.", "totalLabel": "Books in series", "totalPlaceholder": "of", "totalHint": "Total books in this series. Shared with everyone who has this series." } }, "table": { "actions": { "quickView": "Quick View", "bookDetails": "Book Details", "editMetadata": "Edit Metadata", "refreshMetadata": "Refresh Metadata", "addToCollection": "Add to Collection", "sendToDevice": "Send to Device" }, "boolean": { "ariaNotSet": "Not set - click to set true", "ariaTrue": "True - click to set false", "ariaFalse": "False - click to clear" }, "chips": { "addPlaceholder": "Add..." }, "quickFilter": { "presentFiles": "Filter to present files", "missingFiles": "Filter to missing files", "withCovers": "Filter to books with covers", "missingCovers": "Filter to books missing covers", "missingAudioCovers": "Filter to books missing audiobook covers", "withValues": "Filter to rows with values", "emptyRows": "Filter to empty rows" }, "cover": { "previewDescription": "Book cover preview", "editDescription": "Edit book cover", "editTitle": "Edit cover", "editCover": "Edit Cover", "view": "View cover" }, "date": { "justNow": "just now" }, "format": { "unknown": "unknown" }, "header": { "sortAscending": "Sort Ascending", "sortDescending": "Sort Descending", "clearSort": "Clear Sort", "hideColumn": "Hide Column", "pinLeft": "Pin Left", "pinRight": "Pin Right", "unpinColumn": "Unpin Column", "autoFitWidth": "Auto-Fit Width", "autoFitAllColumns": "Auto-Fit All Columns", "selectAllBooks": "Select all books", "shiftClickSecondarySort": "Shift+click to add secondary sort", "clickToSort": "Click to sort" }, "locks": { "lockAll": "Lock all fields", "unlockAll": "Unlock all fields", "lockField": "Lock field", "unlockField": "Unlock field", "clickToLock": "Click to lock", "clickToUnlock": "Click to unlock" }, "progress": { "complete": "{percent} complete" }, "rating": { "label": "Rating", "remove": "Remove rating", "rate": "Rate {star} out of 5" }, "read": { "play": "Play", "read": "Read", "readFormat": "Read {format}", "playFormat": "Play {format}", "primary": "Primary", "peekFormat": "Peek {format}", "chooseFormat": "Choose format to read or play", "fileFallback": "FILE" }, "readStatus": { "unread": "Unread" }, "series": { "seriesRow": "Series row", "bookCount": "{count, plural, =0 {(no books)} one {(# book)} other {(# books)}}", "readOfCount": "{read} of {total} read" }, "text": { "openDetails": "Open details" } }, "move": { "title": "{count, plural, one {Move # book} other {Move # books}}", "subtitle": "Files move on disk into the destination library. This can change who can see these books.", "searchPlaceholder": "Search libraries", "currentLibrary": "Current", "folderCount": "{count, plural, one {# folder} other {# folders}}", "continue": "Continue", "back": "Back", "confirm": "{count, plural, one {Move # book} other {Move # books}}", "action": "Move to library", "review": { "ready": "{count} ready", "collisions": "{count, plural, one {# name conflict} other {# name conflicts}}", "ineligible": "{count} cannot move", "alreadyThere": "{count} already there", "collisionsHeading": "Name conflicts", "ineligibleHeading": "Cannot be moved", "moreCollisions": "and {count} more" }, "policy": { "suggested": "Use suggested", "keep_both": "Keep both", "merge": "Merge", "skip": "Skip" }, "collision": { "folder_path": "A book already uses this folder name", "file_path": "A file already uses this path", "hash_duplicate": "An identical copy is already in this library" }, "ineligible": { "book_not_present": "The files for this book are missing", "no_content_file": "This book has no readable file", "multi_file_target_per_file": "The destination stores one file per book, and this book has {detail} files", "no_source_access": "You cannot edit the library this book is in", "pattern_unresolved": "The destination library has no usable naming pattern", "path_too_long": "The destination path would be too long", "path_outside_target_root": "The destination path would fall outside the library folder" }, "warning": { "accessLoss": "{user} will stop seeing {count} of these books", "koboImpact": "{count} books will leave {user}'s Kobo on the next sync", "layout": { "wrap_into_folder": "{count} books will each be placed in their own folder", "dissolve_folder": "{count} book folders will be dissolved into single files" }, "crossDevice": "Files move to another drive, so they are copied, verified, then removed." }, "progress": { "label": "Moving books to {library}", "failed": "{count} failed" }, "done": { "summary": "Moved {count} books to {library}", "merged": "{count} merged with copies already there", "skipped": "{count} skipped", "failed": "{count} failed" }, "toast": { "success": "Moved {count} books to {library}", "partial": "Moved {moved} books, {failed} failed" } } }, "bookMetadataFetch": { "book": { "title": "Metadata Fetch" }, "author": { "title": "Author Enrichment" }, "stats": { "queued": "Queued", "processing": "Processing", "rateLimited": "Rate limited", "failed": "Failed" }, "actions": { "pause": "Pause", "resume": "Resume", "cancelQueued": "Cancel queued", "dismissBookStatus": "Dismiss metadata fetch status", "dismissAuthorStatus": "Dismiss author enrichment status" }, "cancel": { "processingWillFinish": "Currently processing items will finish.", "confirm": "Confirm cancel", "keepRunning": "Keep running" }, "viewFailed": "{count, plural, one {View one failed} other {View # failed}}", "card": { "fetchingMetadata": "Fetching metadata", "enrichingAuthors": "Enriching authors", "metadataFetchFinished": "Metadata fetch finished", "authorEnrichmentFinished": "Author enrichment finished" }, "label": { "paused": "Paused", "remaining": "{count} remaining", "processing": "{count} processing", "failed": "{count} failed", "rateLimited": "{count} rate limited" }, "report": { "bookTitle": "Failed Metadata Fetches", "authorTitle": "Failed Author Enrichments", "noFailedItems": "No failed items.", "retryAllFailed": "Retry all failed", "bookFallback": "Book #{id}", "authorFallback": "Author #{id}", "columns": { "title": "Title", "library": "Library", "author": "Author", "error": "Error", "http": "HTTP" } }, "toast": { "failedToPause": "Failed to pause", "failedToResume": "Failed to resume", "failedToCancel": "Failed to cancel", "failedToRetry": "Failed to retry", "failedItemsRequeued": "Failed items requeued", "bookComplete": "Metadata fetch complete - {done} books updated", "bookDoneWithFailures": "Metadata fetch done - {done} processed, {failed} failed", "authorComplete": "Author enrichment complete - {done} authors updated", "authorDoneWithFailures": "Author enrichment done - {done} processed, {failed} failed" } }, "bookDock": { "apply": "Apply", "done": "Done", "discard": "Discard", "deselect": "Deselect", "finalize": "Finalize", "rescan": "Rescan", "uploadAction": "Upload", "uploading": "Uploading...", "searchPlaceholder": "Search files...", "setDestinationAction": "Set Destination", "bulkEditAction": "Bulk Edit", "applyFetched": "Apply Fetched", "retryErrors": "Retry Errors", "discardDialog": { "title": "{count, plural, =0 {Discard no files?} one {Discard the selected file?} other {Discard the # selected files?}}", "description": "{count, plural, =0 {No files are selected.} one {This permanently deletes the selected file from disk. This action cannot be undone.} other {This permanently deletes the # selected files from disk. This action cannot be undone.}}", "confirm": "{count, plural, one {Delete file} other {Delete # files}}", "failed": "The selected files could not be deleted. Try again." }, "commaSeparated": "comma-separated", "destinationLibrary": "Destination Library", "destinationFolder": "Destination Folder", "nFailed": "{count} failed", "updatedOfFiles": "Updated {updated} of {total} files", "errorStatus": "Error {status}", "invalidSeriesIndex": "Enter digits with at most one decimal point, such as 5.10.", "tab": { "all": "All", "pending": "Pending", "ready": "Ready", "error": "Error" }, "status": { "pending": "Pending", "extracting": "Extracting", "fetching": "Fetching", "ready": "Ready", "error": "Error" }, "field": { "title": "Title", "subtitle": "Subtitle", "authors": "Authors", "authorsCommaSeparated": "Authors (comma-separated)", "publisher": "Publisher", "publishedDate": "Published Date", "year": "Year", "language": "Language", "isbn13": "ISBN-13", "isbn10": "ISBN-10", "series": "Series", "seriesIndex": "Series #", "genres": "Genres", "genresCommaSeparated": "Genres (comma-separated)", "description": "Description" }, "upload": { "nDone": "{count} done", "nFailed": "{count} failed", "nTotal": "{count} total" }, "uploadFailures": { "heading": "{count, plural, one {Could not upload # file} other {Could not upload # files}}", "dismissAll": "Dismiss all", "retry": "Retry uploading {name}", "dismiss": "Dismiss {name}", "reason": { "unsupported": "Unsupported file type: .{extension}", "noExtension": "The file has no extension, so its format is unknown", "tooLarge": "Larger than the {limit} upload limit", "tooLargeServer": "Larger than the server upload limit", "tooLargeProxy": "Rejected as too large before it reached BookOrbit, likely by a reverse proxy", "storageFull": "The server is out of storage space", "network": "Could not reach the server", "status": "Upload failed (HTTP {status})" } }, "fileList": { "emptyTitle": "No files in Book Dock", "emptyMessageDefault": "Upload files or drop them in the Book Dock folder", "colCurrent": "Current", "colNew": "New", "colFile": "File", "colSize": "Size", "colFormat": "Format", "colMatch": "Match", "colApply": "Apply", "colStatus": "Status", "applyFetchedMetadata": "Apply fetched metadata", "coverPreview": "Cover preview", "coverPreviewDescription": "Enlarged cover image preview dialog.", "currentCoverAlt": "{title} current cover", "newCoverAlt": "{title} new cover", "unknownLibrary": "Unknown library", "unassigned": "Unassigned", "targetPath": "Target: {library} · {path}", "targetUnassigned": "Target: Unassigned", "targetUnknownPath": "Target: {library} · Unknown destination path" }, "sheet": { "saved": "Saved", "providerMetadataFound": "Provider metadata found", "providerMetadataFoundEdited": "Provider metadata found - bulk apply will skip this file (you have edits)", "review": "Review", "added": "Added {date}", "searchMetadata": "Search Metadata", "results": "Results" }, "bulkEdit": { "title": "{count, plural, =0 {Bulk Edit no files} one {Bulk Edit # file} other {Bulk Edit # files}}", "resultTitle": "Bulk Edit Results", "instructions": "Toggle the fields you want to update. Only enabled fields will be applied.", "mergeArrays": "Merge arrays (add to existing values instead of replacing)", "failed": "Bulk edit failed" }, "setDestination": { "title": "{count, plural, =0 {Set Destination for no files} one {Set Destination for # file} other {Set Destination for # files}}", "resultTitle": "Destination Updated", "failed": "Failed to set destination" }, "finalizeDialog": { "title": "{count, plural, =0 {Finalize no files} one {Finalize # file} other {Finalize # files}}", "resultTitle": "Finalize Results", "needDestination": "{count, plural, =0 {{without} of # selected files need a destination} one {{without} of # selected file needs a destination} other {{without} of # selected files need a destination}}", "allHaveDestination": "All selected files already have destination set", "defaultDestinationLibrary": "Default Destination Library", "defaultDestinationFolder": "Default Destination Folder", "renamePreview": "Rename preview", "moreFiles": "+{count} more files", "start": "Start", "filesFinalized": "{succeeded} of {total} files finalized", "checking": "Checking selected files...", "readyCount": "{count, plural, =0 {no files ready} one {# file ready} other {# files ready}}", "duplicateCount": "{count, plural, =0 {none already in library} one {# already in library} other {# already in library}}", "conflictCount": "{count, plural, =0 {no filename conflicts} one {# filename conflict} other {# filename conflicts}}", "missingDestinationCount": "{count, plural, =0 {no missing destinations} one {# missing destination} other {# missing destinations}}", "blockedCount": "{count, plural, =0 {no files blocked} one {# file blocked} other {# files blocked}}", "moreDuplicates": "+{count} more already in library", "discardDuplicates": "Discard duplicates", "failedCount": "{count, plural, =0 {no files failed} one {# file failed} other {# files failed}}", "failedWithDuplicates": "{count, plural, =0 {{failed} failed (# duplicates)} one {{failed} failed (# duplicate)} other {{failed} failed (# duplicates)}}", "view": "View", "viewExisting": "View existing", "hide": "Hide", "details": "Details", "alreadyExistsSaveAs": "Already exists - save as:", "renamePlaceholder": "e.g. {name} (2)", "import": "Import" }, "layout": { "pause": "Pause", "resume": "Resume", "pauseUpdateFailed": "Pause update failed", "clearSearch": "Clear search", "filter": { "all": "All", "needsReview": "Needs review", "pending": "Pending", "ready": "Ready", "error": "Error" }, "working": { "label": "{count} working" }, "row": { "select": "Select {title}", "setDestination": "Set destination", "file": "File", "match": "{percent}% match", "noAuthor": "No author yet", "proposedChanges": "Proposed changes", "noChanges": "No metadata fetched yet", "editDetails": "Edit details", "noMatch": "No match", "applied": "Applied", "refetch": "Re-fetch metadata", "clickToZoom": "Click a cover to enlarge", "changedFields": "{count, plural, one {# field} other {# fields}}", "needMore": "Need to search providers or edit other fields?" }, "selection": { "fileToLibrary": "{count, plural, =0 {File to library} one {File # to library} other {File # to library}}", "nSelected": "{count} selected", "nReadyToFile": "{count} ready to file" }, "empty": { "nothingToReview": "Nothing needs review. Every ready file has a destination and a confident match.", "nothingReadyToFile": "No files are ready to file.", "dropHint": "Or drop files anywhere on this page." }, "selectAllOnPage": "Select all files on this page", "showingOf": "{shown} of {total}", "keyboardHint": "J / K to move · space to select · enter to expand", "allOnPageSelected": "All {count} on this page are selected.", "selectAllMatching": "Select all {count} matching", "allMatchingSelected": "All {count} matching files are selected", "sort": { "label": "Sort by", "attention": "Needs attention", "createdAt": "Recently added", "fileName": "File name", "fileSize": "Size", "format": "Format", "status": "Status" }, "conflict": { "duplicate": "Duplicate", "destination_conflict": "Path taken", "invalid_target": "Bad target", "access_denied": "No access", "invalid_format": "Bad format", "error": "Would fail" }, "unit": { "fileCount": "{count, plural, one {# file} other {# files}}", "filesHeading": "{count, plural, one {File in this entry} other {# files in this entry}}", "role": { "content": "Book", "cover": "Cover", "metadata": "Metadata", "supplement": "Extra" } } } }, "bookRequests": { "title": "Requests (Beta)", "subtitle": "Ask for books the library does not have yet. This feature is experimental, expect minor bugs.", "tabs": { "search": "Request a book", "mine": "My requests", "all": "All requests" }, "mediaKind": { "ebook": "E-book", "audiobook": "Audiobook", "comic": "Comic" }, "status": { "pending": "Pending", "approved": "Approved", "rejected": "Rejected", "cancelled": "Cancelled", "searching": "Searching", "grabbed": "Grabbed", "downloading": "Downloading", "importing": "Importing", "needs_review": "Needs review", "available": "Available", "failed": "Failed" }, "search": { "titleLabel": "Title", "titlePlaceholder": "Book title", "authorLabel": "Author", "authorPlaceholder": "Author name", "mediaKindLabel": "Format", "libraryLabel": "Add to library", "libraryAny": "Let the approver decide", "libraryDefault": "Default ({library})", "libraryChoose": "Choose a library", "libraryRequired": "Your requests are approved as soon as you make them, so pick the library the book should land in.", "fulfillmentLabel": "Fulfillment", "fulfillmentAutomatic": "Automatic", "fulfillmentChooseRelease": "Choose a release", "folderLabel": "Folder", "languageLabel": "Request language", "languageAny": "Any language", "languageDefaultToggleLabel": "Use this language for new requests", "languageDefaultSetHint": "Ask for this language on every new request", "languageDefaultClearHint": "Stop asking for this language by default", "languageDefaultSaved": "New requests will ask for {language}", "languageDefaultCleared": "New requests will follow your interface language", "languageDefaultFailed": "Could not save your language preference", "submit": "Search", "searching": "Searching providers...", "noResultsTitle": "No matching books found", "noResultsHint": "Try a different title or author.", "noResultsIndexerHint": "Try a different title or author, or search the indexers for \"{title}\" and pick a release yourself.", "freeTextAction": "Search indexers", "noResultsRequestHint": "Try a different title or author, or request \"{title}\" as typed. A note for the approver under More options helps them find the right book.", "noResultsRequestAutoHint": "Try a different title or author, or request \"{title}\" as typed.", "requestAnywayAction": "Request anyway", "searchAuthor": "Show books by {author}", "manualSearchAction": "Search indexers manually", "yearUnknown": "Year unknown", "sourceCount": "{count, plural, one {# source} other {# sources}}", "sourcesLabel": "Sources: {sources}", "sourcesUnavailable": "Some sources did not respond, so results may be incomplete: {sources}", "identifiers": { "none": "No ISBN", "one": "1 ISBN", "confirmed": "ISBN confirmed", "count": "{count} ISBNs", "sourcesTitle": "Metadata sources", "provider": "Provider", "providerTitle": "Provider title", "isbn": "ISBN", "year": "Year", "language": "Language", "notProvided": "Not provided", "searchScope": "Choose one of {count, plural, one {# ISBN} other {# ISBNs}} to search, or search by title and author.", "searchScopeLimited": "Choose one ISBN to search.", "titleAuthorOnly": "No ISBN was provided. BookOrbit will search once by title and author.", "chooseSearch": "Choose an edition to search", "searchByEdition": "Find a release for an edition", "findRelease": "Find release", "primaryIsbn": "ISBN {isbn}", "primaryTitleAuthor": "Title and author", "recommended": "Recommended", "recommendationHelpLabel": "How BookOrbit chooses the recommended ISBN", "recommendationTitle": "How the recommended search is chosen", "recommendationLanguage": "Prefer the requested language, then an unknown language, before a known mismatch.", "recommendationAgreement": "Prefer an ISBN confirmed by more independent metadata providers.", "recommendationProvider": "Use BookOrbit's stable metadata-provider priority.", "recommendationRelevance": "Use the edition's position in that provider's results.", "recommendationYear": "Prefer an edition year closest to the work's earliest known year.", "recommendationStable": "Use the ISBN itself as the final stable tie-breaker.", "recommendationFallback": "If no valid ISBN is available, BookOrbit searches once by title and author. Choosing an edition from the menu always overrides this recommendation.", "withoutIsbn": "Search by title and author", "action": "Action" }, "request": "Request", "download": "Download", "getAutomatically": "Get automatically", "chooseRelease": "Choose release", "joinRequest": "Add me too", "submitted": "Request submitted", "joinedExisting": "Added you to the existing request", "submitFailed": "Could not submit that request", "alreadyInLibrary": "Already in your library", "alreadyRequested": "Already requested by someone else", "alreadyRequestedByYou": "You already requested this", "preferredFormatsLabel": "Preferred formats", "preferredFormatsHint": "Releases in these formats are ranked higher. Other formats are still offered.", "noteLabel": "Note for the approver", "notePlaceholder": "Anything worth knowing about this request", "moreOptions": "More options", "fewerOptions": "Fewer options", "optionsSummary": "{formats} · note added", "formatToggleAria": "Prefer {format}", "pair": { "choice": "Both", "choiceHint": "Ask for the e-book and the audiobook together", "ebookLibraryLabel": "E-book library", "audiobookLibraryLabel": "Audiobook library", "audiobookFolderLabel": "Audiobook folder", "landsTogether": "Both formats arrive as one book in {library}.", "landsSeparately": "{library} keeps one book per file, so each format arrives as a book of its own.", "landsApart": "The e-book and the audiobook go to different libraries, so they arrive as two books.", "preferredEbookFormats": "Preferred e-book formats", "preferredAudiobookFormats": "Preferred audiobook formats", "state": { "owned": "In your library", "following": "You requested this", "joinable": "Requested", "new": "Not requested" }, "requestBoth": "Request both", "getBoth": "Get both", "chooseReleases": "Choose releases", "joinBoth": "Add me to both", "requestEbook": "Request e-book", "requestAudiobook": "Request audiobook", "getEbook": "Get e-book", "getAudiobook": "Get audiobook", "joinEbook": "Add me to the e-book request", "joinAudiobook": "Add me to the audiobook request", "haveBoth": "In your library", "requestedBoth": "Requested", "submitted": "Requested the e-book and the audiobook", "submittedPartlyJoined": "Requested both. One was already on its way, so you were added to that request", "submittedJoinsBook": "Requested. It will join the copy already in your library" } }, "card": { "details": "Details", "mediaKind": "Format", "library": "Library", "requestedBy": "Requested by", "requestedByAt": "{name} on {time}", "alsoWanted": "Also wanted by", "alsoWantedCount": "{count, plural, one {# other person wants this} other {# others want this}}", "moreActions": "More actions for {title}", "settledIn": "Filed in {library}, {time}", "settledAt": "Closed {time}", "dismissedBadge": "Dismissed" }, "detail": { "unknownAuthor": "Author unknown", "requestedBy": "Requested by", "requestedOn": "Requested on", "library": "Library", "series": "Series", "isbn": "ISBN", "decidedBy": "Decided by", "requesterNote": "Note from the requester", "decisionNote": "Decision note", "statusReason": "What stopped it", "alsoWanted": "Also wanted by", "decisionNoteLabel": "Note (optional)", "decisionNotePlaceholder": "Explain the decision", "destinationLibraryLabel": "Destination library", "destinationLibraryPlaceholder": "Choose a library", "destinationFolderLabel": "Destination folder", "languageLabel": "Language asked for", "languageAny": "Any language", "destinationRequired": "Approving files the book into a library, so pick one before you approve.", "fulfilTitle": "Close this request", "fulfilHint": "Point the request at the book you added, or at the Book Dock file waiting to be filed.", "bookIdLabel": "Book ID", "bookIdPlaceholder": "e.g. 128", "dockFileIdLabel": "Book Dock file ID", "dockFileIdPlaceholder": "e.g. 42", "backToList": "All requests", "loading": "Loading request...", "transfer": "Transfer", "requestSection": "Request", "decideTitle": "Approve or reject", "fulfilSourceLabel": "What closes this request", "fulfilFromLibrary": "A book in the library", "fulfilFromDock": "A Book Dock file", "fulfilSearchLabel": "Search for the file that closes this request", "fulfilSearchBooks": "Search your library by title or author", "fulfilSearchDock": "Search the Book Dock by file name", "fulfilSearching": "Searching...", "fulfilNoResults": "Nothing matched. Try a different search.", "errors": { "notFound": "That request no longer exists.", "forbidden": "That request belongs to someone else.", "loadFailed": "Could not load that request" }, "entityName": "Request", "pairSwitchLabel": "Formats in this request", "joinsBook": "Joins a book you have", "joinsBookHint": "When this arrives it is added to the book already in your library" }, "actions": { "approve": "Approve", "approveAndNext": "Approve and next", "reject": "Reject", "cancel": "Cancel request", "cancelDownload": "Cancel download", "dismiss": "Dismiss", "restore": "Restore", "delete": "Delete request", "markFulfilled": "Mark fulfilled", "grab": "Find a release", "goToBook": "Go to book", "retryRelease": "Try another release", "leave": "Leave request", "pair": { "approveBoth": "Approve both", "approveEbook": "Approve e-book", "approveAudiobook": "Approve audiobook", "rejectBoth": "Reject both", "rejectEbook": "Reject e-book", "rejectAudiobook": "Reject audiobook", "cancelBoth": "Cancel both", "cancelEbook": "Cancel e-book", "cancelAudiobook": "Cancel audiobook", "dismissBoth": "Dismiss both", "dismissEbook": "Dismiss e-book", "dismissAudiobook": "Dismiss audiobook", "restoreBoth": "Restore both", "restoreEbook": "Restore e-book", "restoreAudiobook": "Restore audiobook", "grabEbook": "Find an e-book release", "grabAudiobook": "Find an audiobook release", "chooseReleases": "Choose releases", "openEbook": "Open the e-book request", "openAudiobook": "Open the audiobook request" } }, "filters": { "status": "Status", "anyStatus": "Any status", "mediaKind": "Format", "anyMediaKind": "Any format", "requester": "Requester", "anyRequester": "Any requester", "showDismissed": "Show dismissed", "fulfilment": "Fulfilment", "anyFulfilment": "Any fulfilment", "selfServeOnly": "Self-served", "approvedOnly": "Went through approval" }, "list": { "loading": "Loading requests...", "emptyMine": "You have not requested any books yet.", "emptyAll": "No book requests yet.", "pagination": "Request pages", "pageOf": "Page {page} of {total}", "emptyHint": "Search for a book and it will show up here once you ask for it." }, "toasts": { "approved": "Request approved", "rejected": "Request rejected", "cancelled": "Request cancelled", "downloadCancelled": "Download cancelled", "dismissed": "Hidden from your list", "restored": "Back on your list", "deleted": "Request deleted", "fulfilled": "Request marked fulfilled", "grabbed": "Download started", "downloadRemoved": "Removed from the download client", "bulkApproved": "{count, plural, one {# request approved} other {# requests approved}}", "bulkApprovedPartial": "{done} approved, {failed} could not be", "bulkDismissed": "{count, plural, one {# request hidden} other {# requests hidden}}", "bulkDismissedPartial": "{done} hidden, {failed} could not be", "unitChosen": "Importing the book you chose", "languageChanged": "Request language updated", "left": "You have left this request", "bulkRejected": "{count, plural, one {# request rejected} other {# requests rejected}}", "bulkRejectedPartial": "{done} rejected, {failed} could not be", "importDiscarded": "The imported file was discarded", "pairApproved": "Approved both", "pairRejected": "Rejected both" }, "errors": { "loadFailed": "Could not load requests", "approveFailed": "Could not approve that request", "rejectFailed": "Could not reject that request", "cancelFailed": "Could not cancel that request", "cancelDownloadFailed": "Could not cancel that download", "dismissFailed": "Could not hide that request", "restoreFailed": "Could not bring that request back", "deleteFailed": "Could not delete that request", "fulfilFailed": "Could not close that request", "grabFailed": "Could not start that download", "removeDownloadFailed": "Could not remove that torrent from the download client", "bulkApproveFailed": "Could not approve the selected requests", "bulkDismissFailed": "Could not hide the selected requests", "selectUnitFailed": "That book could not be imported.", "languageChangeFailed": "Could not change the request language", "leaveFailed": "That request could not be left", "bulkRejectFailed": "That selection could not be rejected", "discardImportFailed": "That import could not be discarded", "approveCompanionFailedEbook": "Approved this one, but the e-book could not be approved", "approveCompanionFailedAudiobook": "Approved this one, but the audiobook could not be approved" }, "grab": { "title": "Send to a download client", "subtitle": "Paste a magnet link or upload a .torrent for \"{title}\".", "singleFileNote": "A release can be one book in several formats, an audiobook in parts, or an archive - all of those import as a single book. A release holding several separate books asks you which one to keep.", "magnet": "Magnet link", "torrentFile": ".torrent file", "client": "Download client", "submit": "Send", "errors": { "pickOne": "Provide either a magnet link or a .torrent file, not both", "fileTooLarge": "That file is larger than {limit}, so it is not a .torrent file", "fileUnreadable": "That file could not be read" }, "noClientList": "BookOrbit will use its highest-priority enabled download client." }, "attempts": { "title": "Earlier attempts", "loading": "Loading earlier attempts...", "loadFailed": "Could not load the earlier attempts", "refused": "Refused, nothing downloaded", "handPicked": "Sent by hand" }, "download": { "source": { "automatic": "Grabbed automatically", "manual": "Picked by an approver", "pasted": "Pasted by hand" }, "transferred": "{done} of {total}", "transferredUnknown": "{done} downloaded", "progressLabel": "Download progress for {title}", "status": { "queued": "Queued for download", "downloading": "Downloading", "completed": "Download finished", "importing": "Importing into your library", "needs_review": "Waiting for review in the Book Dock", "imported": "Added to your library", "failed": "Download failed" } }, "releases": { "title": "Pick a release", "retryTitle": "Try another release", "pairTitle": "Pick releases", "pair": { "tabsLabel": "Formats to pick releases for", "releaseCount": "{count, plural, one {# release} other {# releases}}", "searching": "Searching", "toChoose": "To choose", "sent": "Sent", "finishedTitle": "Nothing left to choose", "finishedHint": "Both formats have their release now. You can follow each one from the request.", "backToRequest": "Back to the request", "done": "Done" }, "subtitle": "Ranked across every enabled indexer.", "summaryCount": "{count, plural, one {# release} other {# releases}}", "allFreeleech": "all freeleech", "allLanguage": "all {language}", "allFormat": "all {format}", "allIndexer": "all from {name}", "criteria": { "label": "Active search", "searched": "Searched", "searchedTitleAuthor": "Searched title and author", "nothingFound": "Nothing found for {key}", "changeSearch": "Change search", "closeSearch": "Close", "sources": "Sources", "sourceSearchedIsbn": "searched the ISBN", "sourceSearchedTitleAuthor": "searched the title and author", "sourceNoAdapter": "no matching adapter", "sourceReleases": "{count, plural, one {# release} other {# releases}}", "sourceNone": "no matches", "sourceFiltered": "{count} filtered out", "sourcesSearched": "{count, plural, one {# source searched} other {# sources searched}}", "showEachSource": "Show each", "uncovered": "{count, plural, one {# enabled source does} other {# enabled sources do}} not carry this kind of book", "fixSource": "Fix in settings", "searchInstead": "Search this instead", "keyTried": "tried, nothing found", "keyTriedCount": "tried, {count, plural, one {# release} other {# releases}}", "searchWithoutIsbn": "Title and author", "customIsbnSource": "Custom ISBN", "filteredLocally": "Filtered locally:", "title": "Title", "author": "Author", "additionalAuthors": "Additional authors", "isbn10": "ISBN-10", "isbn13": "ISBN-13", "isbns": "ISBNs", "mediaKind": "Media", "language": "Language", "formats": "Preferred formats", "editFields": "Edit fields", "closeEditor": "Close editor", "authorsEditor": "Authors, one per line", "authorsPlaceholder": "One author per line", "authorsInvalid": "Use no more than 50 authors, with 255 characters or fewer per author.", "languagePlaceholder": "Any language", "formatsPlaceholder": "epub, azw3", "formatsInvalid": "Use no more than 20 formats, with 20 characters or fewer per format.", "isbnSelection": "Search method", "isbnSelectionHint": "Choose one ISBN, title and author, or add a custom ISBN.", "noIsbnSelected": "Title and author, without an ISBN", "customIsbn": "Custom ISBN", "customIsbnPlaceholder": "ISBN-10 or ISBN-13", "addIsbn": "Add ISBN", "invalidIsbn": "{isbn} is not a valid ISBN-10 or ISBN-13.", "titleRequired": "Enter a title to search.", "fixedMedia": "Media remains {media} because it controls compatible sources and the fulfillment path.", "useRequestFields": "Use request fields", "runSearch": "Search with these fields" }, "previousFailure": "The last attempt failed: {reason}", "refused": { "sourceRefused": "This source turned down an earlier release", "sourceUnavailable": "This source did not answer", "vipRequired": "Needs a VIP account on this source", "clientRefused": "Your download client refused an earlier release", "clientUnavailable": "Your download client did not answer an earlier release" }, "clientProblem": { "unavailable": "{client} is not responding", "unavailableUnnamed": "Your download client is not responding", "unavailableHint": "Releases that use it can't be sent until it answers. Check that it is running, then try again.", "refused": "{client} turned down the release", "refusedUnnamed": "Your download client turned down the release", "refusedHint": "Releases that use it can't be sent until this is fixed.", "retry": "Try again" }, "singleFileNote": "A release can be one book in several formats, an audiobook in parts, or an archive - all of those import as a single book. A release holding several separate books asks you which one to keep.", "holdForReview": "Review the download before it is filed", "releasePageLabel": "{title}, release page on {indexer}", "searching": "Searching indexers...", "refresh": "Search again", "cached": "Showing the last search. Search again for fresh results.", "sortBy": "Sort by", "sort": { "score": "Best match", "seeders": "Seeders", "size": "Size", "bitrate": "Bitrate", "added": "Date added" }, "freeleechOnly": "Freeleech only ({count})", "clearFilters": "Clear filters", "filteredEmpty": "No release matches these filters.", "grab": "Download release", "viewFiles": "View files", "hideFiles": "Hide files", "viewDetails": "About contents", "hideDetails": "Hide details", "inspectingFiles": "Reading the release file list...", "inspectingNzb": "Fetching and validating the NZB...", "inspectingShort": "Checking files...", "inspectionFailed": "This release's file list could not be read.", "manifest": { "ready": "{count, plural, one {This release contains # file. The supported book file can be imported.} other {This release contains # files. The supported book file can be imported.}}", "noSupported": "This release has no directly supported book file, so it cannot be sent.", "contentsUnknown": "This release is packaged as an archive (RAR, ZIP or 7z). BookOrbit will extract it after downloading, so its contents are not known yet.", "multipleBooks": "This release contains {count} separate books. After it downloads you will be asked which one to import.", "multiPartBook": "{count, plural, one {This release is one book made of # file.} other {This release is one book made of # files, imported together as a single book.}}", "metadataUnavailable": "This is a magnet link. Its file list is unavailable until a torrent client fetches the metadata from the swarm.", "usenetMetadataUnavailable": "This is a Usenet release. Its final file list is unavailable until NZBGet downloads and post-processes it.", "bookFile": "Book file", "extraFile": "Extra", "truncated": "Showing {shown} of {total} files.", "untitledUnit": "Untitled", "unitFiles": "{count, plural, one {# file} other {# files}}", "unitsTruncated": "Showing {shown} of {total} books.", "ignored": "{count, plural, one {Ignoring # sample or padding file.} other {Ignoring # sample and padding files.}}", "mediaKind": { "ebook": "E-book", "audiobook": "Audiobook", "comic": "Comic" } }, "manual": "Paste a link instead", "manualTorrent": "Use magnet or .torrent instead", "indexer": "Indexer", "size": "Size", "seeders": "Seeders", "language": "Language", "seederCountPlural": "{count, plural, one {# seeder} other {# seeders}}", "seederCountUnknown": "Seeders unknown", "format": "Format", "files": "Files", "fileLayout": { "single": "One listed file", "multi": "Multiple listed files" }, "fileCount": "{count, plural, one {# file} other {# files}}", "audio": "Audio", "bitrateAtLeast": "{rate}k+", "channels": { "mono": "Mono", "stereo": "Stereo" }, "chapterCountPlural": "{count, plural, one {# chapter} other {# chapters}}", "durationHm": "{hours}h {minutes}m", "durationM": "{minutes}m", "freeleech": "Freeleech", "vipOnly": "VIP only", "hideVipOnly": "Hide VIP only", "noneMatchedProfile": "No release here matches your profile for this medium, so none of them will be downloaded automatically. You can still send one by hand. To widen it, add a tier with fewer conditions below the ones you have.", "profileMismatch": { "summary": "{count, plural, one {# release was found, but automatic download will skip it because it does not match any {medium} profile tier.} other {# releases were found, but automatic download will skip them because none matches a {medium} profile tier.}} Match score and profile rules are separate checks. You can still click Send.", "review": "Review {medium} profile", "row": "Automatic download will skip this. Closest tier: {tier}. {reasons}", "failures": { "formatUnknown": "{source} did not state a format; this tier requires {expected}.", "format": "Format is {actual}; this tier requires {expected}.", "fileLayoutUnknown": "{source} did not state a file count; this tier requires {expected}.", "fileLayout": "File layout is {actual}; this tier requires {expected}.", "bitrate": "Bitrate is {actual} kbps; this tier requires at least {expected} kbps.", "channels": "Audio is {actual}; this tier requires {expected}.", "languageUnknown": "{source} did not state a language; this tier requires {expected}.", "language": "Language is {actual}; this tier requires {expected}.", "source": "This source is not included in the tier.", "seeders": "This release has {actual} seeders; this tier requires at least {expected}.", "sizeUnknown": "{source} did not state a size; this tier allows up to {expected}.", "size": "Size is {actual}; this tier allows up to {expected}.", "freeleech": "This tier requires freeleech.", "vipOnly": "This tier excludes VIP-only releases." } }, "alreadyGrabbed": "Already snatched", "freeleechLabel": "Freeleech", "published": "Published", "scoreLabel": "Match score {score} out of 100", "scoreBreakdown": "How this release scored", "whyThisScore": "Why this score", "failures": { "unauthorized": "sign-in expired", "throttled": "rate limited", "timeout": "timed out", "unreachable": "unreachable", "unsupportedMedium": "does not carry this kind of book", "error": "search failed" }, "reasons": { "isbnMatch": "ISBN matches", "titleMatch": "Title match", "authorMatch": "Title and author match", "preferredFormat": "Preferred format {detail}", "knownFormat": "Format {detail}", "unknownFormat": "Format not stated", "expectedSize": "Plausible size", "suspiciousSize": "Unlikely size {detail}", "seeders": "{detail} seeders", "freeleech": "Freeleech", "likelySeveralBooks": "{detail} files, may be several books" }, "errors": { "loadFailed": "Could not search for releases" }, "backToRequest": "Back to the request", "bestMatch": "Best match", "flags": "Flags", "score": "Score", "release": "Release", "send": "Send", "tableCaption": "Releases, ranked", "onlyBestMatch": "That is the only release that matched.", "tiedWithBest": "{count, plural, one {# other release scored the same} other {# other releases scored the same}}", "inspectionFailedHint": "It was not sent to a download client. Try again, or use Paste a link instead.", "inspectionFailedHintGeneric": "It was not sent to a download client. Try again, or choose another release.", "mediumUncovered": "No source carries this kind of book.", "mediumUncoveredHint": "None of your enabled indexers cover it. Add one that does, or paste a link yourself.", "noSourcesConfigured": "No search sources are set up yet.", "noSourcesEnabled": "Every search source is switched off.", "noSourcesConfiguredHint": "Nothing was searched. Add an indexer or install a source plugin, or paste a link to a release yourself.", "noSourcesEnabledHint": "Nothing was searched. Switch one back on, or paste a link to a release yourself.", "noSourcesAskAdmin": "Nothing was searched. Ask an administrator to set up a search source, or paste a link to a release yourself.", "addSource": "Add a source", "reviewSources": "Review sources", "protocol": { "torrent": "Torrent", "usenet": "Usenet", "direct": "Direct download", "directPill": "Direct" } }, "seed": { "title": "Download client", "automated": "BookOrbit picked this release automatically.", "loading": "Reading the download client...", "loadFailed": "Could not reach the download client for this request.", "notInClient": "The download client no longer has this torrent.", "state": "Status", "seeding": "Seeding", "stopped": "Stopped", "client": "Client", "ratio": "Ratio", "time": "Seeding time", "uploaded": "Uploaded", "hours": "{value} h", "ofGoal": "{value} of {goal}", "deleteFiles": "Also delete the downloaded files", "remove": "Remove from client", "removeHint": "BookOrbit never stops a seed on its own. The imported book stays in your library either way.", "confirm": { "title": "Remove this torrent?", "description": "The torrent stops seeding. The downloaded files stay on disk.", "descriptionWithFiles": "The torrent stops seeding and its downloaded files are deleted. The imported book stays in your library." } }, "pipeline": { "label": "Progress", "steps": { "asked": "Asked", "approved": "Approved", "release": "Release found", "downloading": "Downloading", "filed": "Filed" }, "summary": { "waiting": "Waiting at: {step}", "progress": "In progress at: {step}", "done": "Filed in your library", "failed": "Stopped by a failure at: {step}", "stopped": "Stopped at: {step}" } }, "density": { "label": "List density", "comfortable": "Comfortable", "compact": "Compact" }, "drawer": { "label": "Request detail", "description": "The request, the stage it has reached and the decisions open on it.", "previous": "Previous request", "next": "Next request", "position": "{position} of {total}", "shortcuts": "J / K to move, A to approve, Esc to close" }, "table": { "caption": "Book requests, with the stage each one has reached", "cover": "Cover", "title": "Title", "mediaKind": "Format", "requestedBy": "Requested by", "age": "Age", "state": "State", "outcome": "Outcome", "actions": "Actions", "selectAll": "Select every request waiting for approval", "selectRow": "Select {title}", "toggleDetail": "Show what happened to {title}", "release": "Release", "decidedBy": "Decided by", "decisionNote": "Decision note", "requestNote": "Request note", "openDetail": "Open full detail", "pairMedia": "E-book and audiobook" }, "confirm": { "cancelDownloadTitle": "Cancel this download?", "cancelDownloadDescription": "The active transfer stops and the request stays open so another release can be chosen. Client-managed data is kept; partial direct-download staging is deleted.", "cancelTitle": "Stop this request?", "cancelDescription": "It moves to cancelled. Nobody waiting on it will get the book.", "cancelDescriptionWithDownload": "The active transfer is stopped. Data in the download client is kept; partial direct-download staging is deleted.", "deleteTitle": "Delete this request?", "deleteDescription": "The request and the record of who asked for it go for good, for everyone. Any torrent still seeding is removed from the download client with its files kept. Direct-download staging is cleaned automatically. Dismissing the request instead only hides it from your own list.", "discardImportTitle": "Discard this import?", "discardImportDescription": "The downloaded files are removed from the Book Dock and the request is marked failed. The torrent keeps seeding; stop it separately if you want it gone.", "leaveTitle": "Leave this request?", "leaveDescription": "You stop following it and stop being notified about it. Whoever asked for it keeps their request.", "rejectDescription": "Everyone waiting on these requests is told they were turned down. Nothing is downloaded." }, "outcome": { "filedIn": "Filed in {library} {time}", "filed": "Filed {time}", "rejected": "Rejected {time}", "cancelled": "Cancelled {time}", "awaitingApproval": "Waiting for approval", "awaitingReview": "Waiting for a manual check", "failedUnknown": "Stopped without a reason from the indexer", "atStage": { "asked": "Just asked for", "approved": "Approved, not searched yet", "release": "Looking for a release", "downloading": "Downloading the release", "filed": "Filing into the library" } }, "handback": { "AUTOMATION_DISABLED": "Automatic grabbing is off, so this one needs a release picked by hand", "NO_DESTINATION": "This request has no destination library, so there is nowhere to file the book", "ATTEMPT_LIMIT": "Automatic fulfilment gave up after {attempts} attempts", "SEARCH_FAILED": "Could not search for a release: {detail}", "NO_SOURCES_CONFIGURED": "No search sources are set up, so nothing was searched for this request", "NO_SOURCES_ENABLED": "Every search source is switched off, so nothing was searched for this request", "MEDIUM_UNCOVERED": "No enabled search source carries this kind of book, so nothing was searched for this request", "PROFILE_EXCLUDED_ALL": "No release matched the profile for this medium, so this one needs a release picked by hand", "ALL_TRIED": "Every release good enough to grab has already been tried, so this one needs a release picked by hand", "BELOW_SCORE_FLOOR": "No release scored {floor} or better, so this one needs a release picked by hand", "ALL_BLOCKED": "Every release good enough to grab was ruled out by an earlier failure, so this one needs a release picked by hand", "ABANDONED": "No release was picked, so this download was not started" }, "submitError": { "SUBMIT_TITLE_REQUIRED": "Give the book a title before requesting it", "SUBMIT_SELF_FULFIL_FORBIDDEN": "You are not allowed to fulfil your own requests", "SUBMIT_LIBRARY_FORBIDDEN": "You do not have access to that library", "SUBMIT_FOLDER_NEEDS_LIBRARY": "Pick a destination library before picking a folder", "SUBMIT_FOLDER_NOT_IN_LIBRARY": "That folder is not part of the destination library", "SUBMIT_DEFAULT_LIBRARY_UNREACHABLE": "Pick a destination library you can reach: this instance's default is not one of yours", "SUBMIT_DESTINATION_REQUIRED": "Your requests are approved as soon as you make them, so pick the library the book should land in", "SUBMIT_SELF_SERVE_LIMIT": "Finish or cancel some downloads first: you can have {limit} in flight at once", "SUBMIT_ON_BEHALF_FORBIDDEN": "You are not allowed to request books for other people", "SUBMIT_ON_BEHALF_UNKNOWN_USER": "That user cannot have a book request made for them", "SUBMIT_TARGET_BOOK_NOT_FOUND": "That book is not in a library you can reach", "SUBMIT_TARGET_BOOK_HAS_MEDIUM": "That book already has this format" }, "actionError": { "BOOK_REQUEST_NOT_PENDING": "Only a pending request supports this action; this request is currently {status}", "BOOK_REQUEST_NOT_CANCELLABLE": "A request that is {status} can no longer be cancelled", "BOOK_REQUEST_DESTINATION_REQUIRED": "Pick a destination library before approving this request", "BOOK_REQUEST_ACTION_FORBIDDEN": "You are not allowed to {action} this request", "BOOK_REQUEST_STALE_TRANSITION": "This request changed while the action was being applied. It is now {status}." }, "bulk": { "selected": "{count, plural, one {# request selected} other {# requests selected}}", "approveSelected": "{count, plural, one {Approve # request} other {Approve all #}}", "clear": "Clear", "dismissSelected": "{count, plural, one {Hide # request} other {Hide all #}}", "rejectSelected": "{count, plural, one {Reject # request} other {Reject all #}}", "rejectNoteLabel": "Reason (optional)", "rejectNotePlaceholder": "Why these are being turned down", "rejectTitle": "Reject {count, plural, one {# request} other {# requests}}?", "rejectConfirm": "Reject" }, "chooser": { "title": "Choose which book to import", "hint": "This release turned out to contain {count} separate books. The download is finished; pick the one that was requested and the rest are left behind.", "untitled": "Untitled", "files": "{count, plural, one {# file} other {# files}}", "import": "Import this book", "mediaKind": { "ebook": "E-book", "audiobook": "Audiobook", "comic": "Comic" } }, "review": { "title": "Why this is waiting", "scoreShort": "The imported file scored {score} against this request, below the {threshold} needed to file it automatically.", "scoreClears": "The imported file scored {score}, which clears the {threshold} needed to file it automatically.", "verificationOff": "Import checking is off, so this file was never scored against the request.", "heldOnRequest": "This release was sent to be checked before filing, so it is waiting for you.", "reason": { "isbn_match": "Its ISBN is the one that was requested.", "above_threshold": "It looks like the book that was asked for.", "below_threshold": "Check the fields below and decide whether it is the right book.", "author_mismatch": "The title is close, but the author is somebody else.", "no_title": "The file carries no readable title, so there was nothing to compare." }, "field": { "title": "Title", "authors": "Author", "isbn13": "ISBN" }, "verdict": { "match": "Matches", "mismatch": "Does not match", "unknown": "Not compared" }, "requested": "Requested", "imported": "Imported", "releasePage": "Open the release page", "absent": "Neither the request nor the file has one.", "notSet": "Not set", "editionTitle": "What the file says it is", "edition": { "publisher": "Publisher", "published": "Published", "language": "Language", "pages": "Pages", "isbn10": "ISBN-10", "narrators": "Narrated by", "length": "Length", "version": "Version", "chapters": "Chapters" }, "abridged": "Abridged", "unabridged": "Unabridged", "importedCover": "Cover found in the imported file", "filesTitle": "What landed", "fileCount": "{count, plural, one {# file} other {# files}}", "role": { "cover": "Cover", "metadata": "Metadata", "supplement": "Extra" }, "fileAnyway": "File it anyway", "fileAnywayHint": "Files this into the destination library and marks the request available, exactly as a passing score would have.", "fileIt": "File it", "fileItHint": "Files this into the destination library and marks the request available.", "noDestination": "This request has no destination library with a folder in it, so there is nowhere to file the book yet.", "openDock": "Open the Book Dock", "missingEntry": "The file this request was held over is no longer in the Book Dock. It was filed or discarded by hand, so there is nothing left here to review.", "missingEntryNext": "If the book is already in your library, close this request against it below. If it is not, cancel the request and search for another release.", "filed": "Filed into your library.", "fileFailed": "Could not file this import", "discard": "Discard this import", "discardHint": "Use this when the release turned out to be the wrong book. The files are removed from the Book Dock and the request is marked failed." }, "sources": { "noneConfigured": "No search sources are set up.", "allDisabled": "Every search source is switched off.", "noneConfiguredHint": "Requests can be filed, but nothing will be searched for them until you add an indexer or install a source plugin.", "allDisabledHint": "Requests can be filed, but nothing will be searched for them until you switch one back on.", "askAdmin": "Requests can be filed, but nothing will be searched for them until an administrator sets one up.", "addSource": "Add a source", "reviewSources": "Review sources" }, "selfServeBadge": "Self-served", "selfServeBadgeHint": "Downloaded directly by the requester, with no approval step", "missingFormat": { "labelAudiobook": "Audiobook for this book", "labelEbook": "E-book for this book", "noAudiobook": "No audiobook yet", "noEbook": "No e-book yet", "requestAudiobook": "Request audiobook", "requestEbook": "Request e-book", "requested": "Requested", "requestedBySomeone": "Requested by someone else", "ownedElsewhere": "In your library as a separate book", "open": "Open", "viewRequest": "View request", "submittedAudiobook": "Requested. The audiobook will join this book when it arrives", "submittedEbook": "Requested. The e-book will join this book when it arrives" } }, "collection": { "visibleToAll": "Visible to all users", "visibleToAllHint": "Every user can see this collection, but only you can change its books", "dialog": { "name": "Name", "icon": "Icon", "iconPlaceholder": "Choose an icon...", "nameRequired": "Name is required", "iconRequired": "Choose an icon", "creating": "Creating...", "createFailed": "Failed to create collection" }, "createDialog": { "title": "New Collection", "namePlaceholder": "e.g. Favorites" }, "editDialog": { "title": "Edit Collection", "syncToKobo": "Sync to Kobo", "syncToKoboHint": "Books in this collection will appear on your Kobo device", "deleteCollection": "Delete collection", "confirmDelete": "Confirm?", "deleting": "Deleting...", "saving": "Saving...", "deleted": "\"{name}\" deleted", "updateFailed": "Failed to update collection", "deleteFailed": "Failed to delete collection" }, "addToSheet": { "title": "Manage Collections", "selectedCount": "{count, plural, =0 {no books selected} one {one book selected} other {# books selected}}", "newCollection": "New Collection", "namePlaceholder": "Collection name", "create": "Create", "collections": "Collections", "empty": "No collections yet. Create one above.", "done": "Done", "added": "Added", "allAdded": "All {total} added", "inCollection": "In this collection", "allInCollection": "All {total} in this collection", "partialInCollection": "{partial} of {total} in this collection", "bookCount": "{count, plural, =0 {no books} one {one book} other {# books}}", "loadFailed": "Failed to load collections", "createdAndAdded": "{count, plural, =0 {Created \"{name}\" and added no books} one {Created \"{name}\" and added one book} other {Created \"{name}\" and added # books}}", "createdButAddFailed": "Created \"{name}\" but failed to add books", "createFailed": "Failed to create collection", "addedNewWithExisting": "{count, plural, =0 {Added one new book to \"{name}\" ({alreadyHad} already there)} one {Added one new book to \"{name}\" ({alreadyHad} already there)} other {Added # new books to \"{name}\" ({alreadyHad} already there)}}", "addedToCollection": "{count, plural, =0 {Added no books to \"{name}\"} one {Added one book to \"{name}\"} other {Added # books to \"{name}\"}}", "addFailed": "Failed to add to collection", "removedFromCollection": "{count, plural, =0 {Removed no books from \"{name}\"} one {Removed one book from \"{name}\"} other {Removed # books from \"{name}\"}}", "removeFailed": "Failed to remove from collection" } }, "components": { "appHeader": { "searchAllBooks": "Search all books...", "searching": "Searching...", "noResults": "No results", "loadingMore": "Loading more...", "loadMore": "Load more ({loaded}/{total})", "allMatchesShown": "{count, plural, =0 {All 1 match shown} one {All 1 match shown} other {All # matches shown}}", "bookCount": "{count, plural, =0 {no books} one {# book} other {# books}}", "fileCount": "{count, plural, =0 {no files} one {# file} other {# files}}", "uploadedToast": "Uploaded {uploaded}", "uploadFailedToast": "Upload failed for {failed}", "uploadPartialToast": "Uploaded {uploaded}, {failed} failed", "bookDock": "Book Dock", "statistics": "Statistics", "achievements": "Achievements", "annotations": "Annotations", "uploadBooks": "Upload books", "appearance": "Appearance", "appearanceDescription": "Choose theme, accent, corner radius, surface, and background options.", "style": "Style", "surfacePalette": "Surface", "topGlow": "Top glow", "theme": "Theme", "accent": "Accent", "radius": "Radius", "background": "Background", "settings": "Settings", "whatsNew": "What's New", "documentation": "Documentation", "help": "Help", "starOnGithub": "Star on GitHub", "new": "New", "newReleaseNotes": "New release notes available", "account": "Account", "changePassword": "Change Password", "signOut": "Sign out", "githubStar": { "title": "Enjoying BookOrbit?", "body": "If BookOrbit is helping with your library, please consider starring the project on GitHub. It helps more people discover the app and supports ongoing development.", "cta": "Star BookOrbit on GitHub" }, "surfaceOpacity": "Surface opacity", "surfaceOpacityValue": "{value}%", "surfaceBrightnessValue": "{value}%", "readingHistory": "History" }, "sidebar": { "dashboard": "Dashboard", "authors": "Authors", "series": "Series", "tools": "Tools", "libraries": "Libraries", "newLibrary": "New Library", "scanProgress": "{processed} / {total} books", "smartScopes": "Smart Scopes", "newSmartScope": "New Smart Scope", "noSmartScopes": "No Smart Scopes yet", "collections": "Collections", "newCollection": "New Collection", "noCollections": "No collections yet", "newReleaseNotes": "New release notes available", "requestBadge": { "allActive": "{count, plural, one {# active request across all users} other {# active requests across all users}}", "mineActive": "{count, plural, one {# active request of yours} other {# active requests of yours}}" }, "support": "Support BookOrbit", "supportAria": "Support BookOrbit on Ko-fi", "appLinks": { "ios": "Get the iOS app", "android": "Android app coming soon" }, "sectionHeader": { "add": "Add", "showAll": "Show all", "showCount": "Show {count}", "rowsShown": "Rows shown", "menuAria": "Section options for {section}", "reorder": "Reorder", "doneReordering": "Done reordering" }, "noLibraries": "No libraries yet", "clearFilter": "Clear filter", "filterSummary": "{shown} of {total} shown", "filterLibraries": "Filter libraries", "filterLibrariesPlaceholder": "Filter libraries...", "filterSmartScopes": "Filter smart scopes", "filterSmartScopesPlaceholder": "Filter smart scopes...", "filterCollections": "Filter collections", "filterCollectionsPlaceholder": "Filter collections...", "seeAllLibraries": "See all libraries ({count})", "seeAllSmartScopes": "See all smart scopes ({count})", "seeAllCollections": "See all collections ({count})", "updateAvailable": "Update {version}", "updateTooltip": "{version} update available", "openUpdateRelease": "Open the {version} release on GitHub", "zones": { "browse": "Browse", "reading": "Reading" }, "reorder": { "gripAria": "Reorder {name}", "lifted": "{name} lifted, position {position} of {total}. Use the arrow keys to move it.", "moved": "{name}, position {position} of {total}", "dropped": "{name} dropped at position {position} of {total}", "cancelled": "Reorder cancelled. {name} returned to position {position} of {total}.", "filteredHint": "Clear the filter to reorder" }, "customize": { "open": "Customize sidebar", "title": "Customize sidebar", "hint": "Drag to reorder. Hidden pages stay in Search.", "reset": "Reset to default", "done": "Done", "resetDone": "Sidebar reset to default", "showInSidebar": "Show {name} in the sidebar", "show": "Show", "hide": "Hide", "alwaysShown": "{name} is always shown", "returnsWithWork": "Shows when work is waiting" } }, "selectionActionBar": { "setReadingStatus": "Set reading status", "setRating": "Set rating", "openMetadataEditor": "Open metadata editor", "editIndividually": "Edit books individually", "addToCollection": "Add to collection", "removeFromCollection": "Remove from collection", "sendViaEmail": "Send via email", "downloadFilesZip": "Download files as ZIP", "moreActions": "More actions", "setField": "Set field", "refreshMetadata": "Refresh metadata", "refreshConfirm": "{count, plural, one {Refresh metadata for # book?} other {Refresh metadata for # books?}}", "refreshConfirmAction": "Refresh", "reExtractCover": "Re-extract cover", "metadataLock": "Metadata lock", "lockAll": "Lock all", "unlockAll": "Unlock all", "exportMetadata": "Export metadata", "deleteSelected": "Delete selected", "exitSelection": "Exit selection", "downloadFilesZipLabel": "Download files as ZIP:", "primaryOnly": "Primary only", "allFormats": "All formats", "audioOnly": "Audio only", "setRatingLabel": "Set rating:", "clear": "Clear", "setFieldLabel": "Set field:", "apply": "Apply", "fieldPlaceholder": "Leave blank to clear", "fieldPlaceholderArray": "Comma-separated (leave blank to clear)", "deleteConfirm": "{count, plural, =0 {Delete # book?} one {Delete # book?} other {Delete # books?}}", "typeDelete": "Type DELETE" }, "viewHeader": { "select": "Select", "display": "Display", "displayDescription": "Adjust cover size, grid spacing, and view display options.", "columnVisibilityHint": "Use the column visibility panel in the table header to show or hide columns.", "columnVisibilityMobileHint": "Column visibility can be managed from the table header.", "searchPlaceholder": "Search title, author, series, narrator...", "clearSearch": "Clear search", "closeSearch": "Close search", "mobileSearch": { "description": "Search items by title, author, series, or narrator.", "done": "Done" }, "mobileMenu": { "grid": "Grid", "list": "List", "select": "Select", "exitSelect": "Exit Select" }, "displayControls": { "display": "Display", "coverSize": "Cover size", "gridGap": "Grid gap", "pixelValue": "{value} pixels", "showJumpRails": "Show jump rails", "columnsHint": "Use the column visibility panel in the table header to show or hide columns.", "coverShape": "Cover shape", "circle": "Circle", "square": "Square", "rowDensity": "Row height", "densityCompact": "Compact", "densityComfortable": "Cosy", "densityRoomy": "Roomy", "coverFallback": "Use book covers for missing portraits" }, "viewModes": { "grid": "Grid view", "list": "List view", "table": "Table view" } }, "browseHeader": { "eyebrow": { "library": "Library", "smartScope": "Smart scope", "collection": "Collection", "browse": "Browse" }, "facts": { "books": "{count, plural, one {# book} other {# books}}", "booksOf": "{matching} of {total, plural, one {# book} other {# books}}", "authors": "{count, plural, one {# author} other {# authors}}", "series": "{count, plural, one {# series} other {# series}}", "scanned": "Scanned {time}", "scanningProgress": "Scanning {processed} / {total}", "syncsToKobo": "Syncs to Kobo" }, "switcher": { "open": "Switch from {name}", "jumpTo": "Jump to...", "libraries": "Libraries", "smartScopes": "Smart scopes", "collections": "Collections", "empty": "Nothing matches" }, "search": { "removeToken": "Remove filter {label}", "clearAll": "Clear search and filters", "save": "Save", "summaryToken": "{count, plural, one {# filter} other {# filters}}" }, "tokens": { "anyOf": "Any of {count, plural, one {# rule} other {# rules}}", "allOf": "All of {count, plural, one {# rule} other {# rules}}" }, "sort": { "sortBy": "Sort by {field}", "ascending": "Ascending. Switch to descending", "descending": "Descending. Switch to ascending" }, "facets": { "format": "Format", "rules": "Rules", "show": "Show", "library": "Library", "status": "Status", "ruleCount": "{count, plural, one {# rule} other {# rules}}" }, "menu": { "more": "More for {name}", "editRules": "Edit rules", "deleteSmartScope": "Delete Smart Scope", "deleteCollection": "Delete collection", "confirmDelete": "Delete \"{name}\"? This cannot be undone.", "upload": "Upload books" }, "scan": { "scanning": "Scanning", "started": "Scanning {name}", "finished": "Scan of {name} finished" }, "viewModes": "View mode", "legend": "Volume colours" }, "iconPicker": { "clearSelectionAria": "Clear selected icon", "searchLucide": "Search Lucide icons...", "searchCustom": "Search custom icons...", "chooseIcon": "Choose an icon...", "selectIcon": "Select icon", "customTab": "Custom", "searching": "Searching...", "noIconsMatch": "No icons match \"{query}\"", "typeToSearch": "Type to search all icons", "noCustomIcons": "No custom icons uploaded", "noIconsAvailable": "No icons available" }, "entityNotFound": { "title": "{entity} not found", "description": "This {entity} doesn't exist or has been deleted.", "goBack": "Go back" }, "themePicker": { "light": "Light", "dark": "Dark", "system": "System" }, "radiusPicker": { "sharp": "Sharp corners", "default": "Default corners", "rounded": "Rounded corners", "pill": "Pill-shaped corners" }, "languagePicker": { "searchPlaceholder": "Search languages", "suggested": "Suggested", "all": "All languages", "results": "Results", "empty": "No languages match \"{query}\"" }, "userAvatar": { "profilePicture": "Profile picture", "profilePictureOf": "{name} profile picture" }, "ui": { "sidebar": { "title": "Sidebar", "mobileDescription": "Displays the mobile sidebar.", "toggle": "Toggle Sidebar", "collapse": "Collapse sidebar", "expand": "Expand sidebar", "open": "Open sidebar", "close": "Close sidebar" }, "chipInput": { "typeAndEnter": "Type and press Enter to add", "pressEnter": "Press Enter to add", "remove": "Remove {value}" }, "tokenSelect": { "remove": "Remove {value}", "noMatches": "No matches", "showOptions": "Show options" } }, "entityIndex": { "sortBy": "Sort by", "sort": { "custom": "Custom order", "name": "Name", "bookCount": "Book count" }, "ascending": "Ascending", "descending": "Descending", "clearSearch": "Clear search", "resultCount": "{shown} of {total}", "noMatches": "No matches", "noMatchesHint": "Try a different search term.", "bookCount": "Books: {count}", "librariesEmptyHint": "Create a library to start adding books.", "smartScopesEmptyHint": "Smart scopes save a set of filters you use often.", "collectionsEmptyHint": "Collections group books you pick by hand." }, "legalNotices": { "about": "About BookOrbit", "trigger": "Legal notices", "title": "About BookOrbit", "description": "BookOrbit attribution, licensing, and source code.", "poweredBy": "Powered by BookOrbit", "originalDevelopment": "This software contains material originally developed as BookOrbit.", "copyright": "Copyright (C) 2025-2026 neon.", "contributors": "Additional copyright is held by the respective BookOrbit contributors.", "licenseSummary": "Licensed under the GNU Affero General Public License, version 3 only, with additional terms. This software is provided without warranty. You may redistribute and modify it under those terms.", "sourceCode": "Source code", "license": "AGPLv3 license", "additionalTerms": "Additional terms" }, "confirmDialog": { "typeToConfirm": "Type “{phrase}” to confirm" }, "formSheet": { "discardTitle": "Discard changes?", "discardDescription": "Your unsaved changes will be lost.", "discardConfirm": "Discard" }, "backgroundPicker": { "none": "None", "dots": "Dots", "cross": "Cross", "millimeter": "Millimeter", "blueprint": "Blueprint", "brushed": "Brushed", "scanlines": "Scanlines", "vinyl": "Vinyl", "carbon": "Carbon", "perforated": "Perforated", "aurora": "Aurora", "horizon": "Horizon", "glow": "Glow", "mesh": "Mesh", "elevation": "Elevation", "prism": "Prism", "spectrum": "Spectrum", "spectrum-x": "Spectrum X", "spectrum-plus": "Spectrum Plus", "eclipse": "Eclipse" } }, "customIcons": { "dialogTitle": "Upload custom icons", "dialogDescription": "Review names before adding them to your library.", "readingFiles": "Reading files...", "dropPrompt": "Drop SVG files or click to browse", "fileLimit": "Up to {max} files, 128 KB each", "namePlaceholder": "Name", "nameRequired": "Name is required", "invalidSvg": "Invalid SVG", "invalidSvgFile": "Invalid SVG file", "identicalTo": "Identical to \"{name}\"", "uploadAnyway": "Upload anyway", "skipThisOne": "Skip this one", "readyToUpload": "{count} ready to upload", "noIconsStaged": "No icons staged yet", "uploading": "Uploading...", "upload": "Upload", "uploadCount": "Upload {count}", "onlySvgSupported": "Only SVG files are supported", "maxStaged": "You can stage at most {max} icons at once", "onlyMoreCanStage": "{count, plural, =0 {No more icons can be staged} one {Only # more icon can be staged} other {Only # more icons can be staged}}", "readFailed": "Failed to read SVG files", "uploadedCount": "{count, plural, =0 {No icons uploaded} one {Uploaded # icon} other {Uploaded # icons}}", "uploadedPartial": "Uploaded {created}, {failed} failed", "noIconsUploaded": "No icons uploaded", "uploadFailed": "Failed to upload icons", "uploadFailedEntry": "Upload failed" }, "dashboard": { "common": { "failedToLoad": "Failed to load", "retry": "Retry", "untitled": "Untitled", "cover": "Cover", "bookCover": "Book cover" }, "libraryLoad": { "errorTitle": "Unable to load your libraries", "errorDescription": "BookOrbit could not retrieve your libraries. Your library data has not been removed." }, "scroller": { "failedToLoad": "Failed to load.", "empty": { "continueReading": "No books in progress yet. Start reading one to see it here.", "continueListening": "No audiobooks in progress yet. Start listening to one to see it here.", "wantToRead": "No books marked want to read yet.", "upNextInSeries": "No next-in-series picks yet. Finish a volume to surface the next one.", "recentlyAdded": "No books in your library yet.", "smartScope": "No books match this smartScope.", "default": "No books found." } }, "settings": { "title": "Customize Dashboard", "preferencesTitle": "Dashboard preferences", "tabs": { "widgets": "Widgets", "shelves": "Shelves" }, "widgetNames": { "readingStreak": "Reading Streak", "currentlyReading": "Currently Reading", "readingGoal": "Reading Goal", "readingDna": "Reading DNA", "monthlyChallenge": "Monthly Challenge", "highlightOfTheDay": "Highlight of the Day", "neglectedGems": "Neglected Gems", "readingRhythm": "Reading Rhythm", "diversityScore": "Diversity Score", "libraryOverview": "Library Overview", "yearProjection": "Year Projection", "longWait": "The Long Wait" }, "shelfNames": { "recentlyAdded": "Recently Added", "continueReading": "Continue Reading", "continueListening": "Continue Listening", "wantToRead": "Want to Read", "upNextInSeries": "Up Next in Series", "random": "Discover Something New", "smartScope": "Smart Scope" }, "shelfLayout": { "title": "Shelf layout", "description": "Choose how shelves are arranged on larger screens.", "wide": "Wide rows", "wideDescription": "Show one shelf per row.", "twoColumns": "Two columns", "twoColumnsDescription": "Show two shelves per row." }, "shelfSync": { "label": "Sync shelves across sessions", "description": "Save shelf order, visibility, row counts, and layout to your account. When off, shelf settings stay in this browser." }, "saveFailed": "Could not save dashboard settings. Check your connection and try again.", "libraryScope": { "title": "Dashboard libraries", "description": "Choose which libraries contribute books and reading data to this dashboard.", "allLibraries": "All accessible libraries", "summaryNone": "No libraries selected", "summaryCount": "{count, plural, one {# library} other {# libraries}}", "required": "Select at least one library." }, "shelfRows": { "label": "Rows of books", "option": "{count, plural, one {One row of books} other {# rows of books}}", "hint": "Set how many rows of books each shelf shows. Narrow screens show at most two." }, "reorderHintWidget": "Drag to reorder. Toggle to show or hide a widget.", "reorderHintShelf": "Drag to reorder. Toggle to show or hide a shelf.", "smartScope": "Smart Scope", "noSmartScopes": "No Smart Scopes yet. Create one from the sidebar.", "addShelf": "Add shelf", "resetToDefaults": "Reset to defaults" }, "welcome": { "emptyTitle": "Your library is empty", "noLibrariesTitle": "No libraries yet", "emptyDescription": "Create a library to start organizing and reading your books. Point it to a folder and it will do the rest.", "noLibrariesDescription": "Your administrator hasn't set up any libraries yet. Reach out to them to get started.", "createFirstLibrary": "Create your first library" }, "widgets": { "currentlyReading": { "title": "Currently Reading", "empty": "No books in progress. Start reading one to see it here.", "continueReading": "Continue reading" }, "diversityScore": { "title": "Diversity Score", "notEnoughData": "Read at least 3 books to see your diversity score", "booksAnalyzed": "{count, plural, =0 {no books analyzed} one {# book analyzed} other {# books analyzed}}", "subScores": { "genre": "Genre", "author": "Author", "era": "Era", "language": "Lang" } }, "highlightOfTheDay": { "title": "Highlight of the Day", "empty": "Highlight passages while reading to see them here" }, "libraryOverview": { "title": "Library Overview", "empty": "Your library is empty. Add some books to get started.", "addedThisYear": "+{count} added this year", "stats": { "books": "Books", "authors": "Authors", "series": "Series", "storage": "Storage" } }, "longWait": { "title": "The Long Wait", "empty": "No books waiting. You've started everything!", "daysWaiting": "days waiting", "pages": "{count, plural, =0 {no pages} one {# page} other {# pages}}", "startReading": "Start Reading" }, "monthlyChallenge": { "title": "Monthly Challenge", "complete": "Complete!" }, "neglectedGems": { "title": "Neglected Gems", "empty": "All your top-rated books have been read!", "rating": "{rating}/5", "daysWaiting": "{count}d waiting", "queued": "Queued", "addToQueue": "Add to queue", "shuffle": "Shuffle" }, "readingDna": { "title": "Reading DNA", "notEnoughData": "Read at least 5 books to unlock your Reading DNA", "basedOn": "{count, plural, =0 {Based on no books} one {Based on # book} other {Based on # books}}", "traits": { "length": "Length", "variety": "Variety", "rhythm": "Rhythm", "time": "Time", "speed": "Speed" } }, "readingGoal": { "title": "Reading Goal {year}", "setGoalPrompt": "Set a reading goal to track your progress", "setGoal": "Set goal", "booksPerYear": "Books per year", "ofGoal": "of {goal}", "percentComplete": "{percentage}% complete", "editGoal": "Edit goal" }, "readingRhythm": { "title": "Reading Rhythm", "empty": "Start reading to see your rhythm take shape", "activeDays": "{count, plural, =0 {no active days} one {# active day} other {# active days}}", "consistency": "{activeDays} · {percent}% consistency", "avgPerDay": "avg {time}/day" }, "readingStreak": { "title": "Reading Streak", "empty": "Read today to start your streak", "streakLabel": "{count, plural, =0 {day streak} one {day streak} other {days streak}}", "best": "{count, plural, =0 {Best: # day} one {Best: # day} other {Best: # days}}", "lastSevenDays": "Last 7 days" }, "yearProjection": { "title": "Year Projection", "books": "books", "trendUp": "Trending up", "trendDown": "Trending down", "trendSteady": "Steady pace", "pages": "pages", "hours": "hours", "readCount": "{count} read", "daysLeft": "{count}d left" } } }, "email": { "title": "Email", "subtitle": "Send books to your e-reader via email.", "loadFailed": "Failed to load", "saveFailed": "Failed to save", "deleteFailed": "Failed to delete", "setDefaultFailed": "Failed to set default", "setAsDefault": "Set as default", "saving": "Saving...", "update": "Update", "create": "Create", "deleteConfirm": "Delete \"{name}\". This action cannot be undone.", "badge": { "default": "Default", "shared": "Shared", "system": "System" }, "tabs": { "providers": "Providers", "servers": "Mail servers", "recipients": "Recipients", "groups": "Groups", "templates": "Templates", "preferences": "Preferences", "history": "History" }, "providers": { "heading": "SMTP Providers", "add": "Add provider", "newTitle": "New Provider", "editTitle": "Edit Provider", "name": "Name", "namePlaceholder": "e.g. Gmail", "host": "Host", "port": "Port", "username": "Username", "password": "Password", "passwordEdit": "Password (leave blank to keep current)", "fromName": "From Name", "fromNamePlaceholder": "My Library", "fromAddress": "From Address", "authentication": "Authentication", "verifyTls": "Verify TLS certificate", "tlsWarning": "TLS verification is disabled. The server's certificate will not be validated - use only for trusted internal servers.", "noFromAddress": "no from address", "emptyManage": "No providers yet. Add an SMTP provider to start sending emails.", "emptyReadonly": "No providers available. Ask an administrator to add one.", "setSystemTooltip": "Set as system mail provider", "removeSystemTooltip": "Remove as system mail provider", "testTooltip": "Test connection", "toggleSharing": "Toggle sharing", "removeSystemBeforeDelete": "Remove the system designation before deleting", "notesHeading": "Provider Notes", "notesBody": "The {system} provider (superuser only) is used for password reset emails. The {defaultProvider} provider is used when sending books with no explicit provider selected. Providers marked {shared} are available to all users.", "deleteTitle": "Delete provider?", "nameHostRequired": "Name and host are required", "created": "Provider created", "updated": "Provider updated", "deleted": "\"{name}\" deleted", "setDefaultSuccess": "\"{name}\" set as default", "unshared": "Provider unshared", "sharedWithAll": "Provider shared with all users", "updateSharingFailed": "Failed to update sharing", "systemRemoved": "\"{name}\" removed as system mail provider", "systemSet": "\"{name}\" set as system mail provider", "updateSystemFailed": "Failed to update system provider", "connectionSuccess": "Connection successful", "connectionFailed": "Connection failed", "testFailed": "Test failed" }, "recipients": { "heading": "Recipients", "add": "Add recipient", "newTitle": "New Recipient", "editTitle": "Edit Recipient", "name": "Name", "namePlaceholder": "My Kindle", "emailAddress": "Email address", "deviceType": "Device type", "deviceNone": "None", "deviceOther": "Other", "preferredFormat": "Preferred format", "formatAuto": "Auto", "defaultTemplate": "Default template", "useAccountDefault": "Use account default", "kindleNote": "Kindle recipients automatically receive emails with subject \"convert\" to trigger format conversion.", "empty": "No recipients yet.", "prefersFormat": "prefers {format}", "deleteTitle": "Delete recipient?", "nameEmailRequired": "Name and email are required", "created": "Recipient created", "updated": "Recipient updated", "deleted": "\"{name}\" deleted", "setDefaultSuccess": "\"{name}\" set as default" }, "groups": { "heading": "Recipient Groups", "create": "Create group", "newTitle": "New Group", "name": "Group name", "namePlaceholder": "e.g. Book Club", "creating": "Creating...", "empty": "No groups yet. Create a group to send to multiple recipients at once.", "memberCount": "{count, plural, =0 {no members} one {one member} other {# members}}", "deleteTooltip": "Delete group", "noMembers": "No members yet.", "removeMember": "Remove", "selectRecipient": "Select recipient...", "add": "Add", "addMember": "Add member", "allRecipientsInGroup": "All recipients are already in this group.", "deleteTitle": "Delete group?", "created": "Group created", "createFailed": "Failed to create group", "deleted": "\"{name}\" deleted", "memberAdded": "Member added", "addMemberFailed": "Failed to add member", "memberRemoved": "Member removed", "removeMemberFailed": "Failed to remove member" }, "templates": { "heading": "Email Templates", "new": "New template", "newTitle": "New Template", "editTitle": "Edit Template", "name": "Name", "namePlaceholder": "Default", "subject": "Subject", "body": "Body", "availableVariables": "Available variables", "editTemplate": "Edit template", "empty": "No templates yet.", "notesHeading": "Template Notes", "notesBody": "System templates cannot be deleted. Administrators can edit them. Use variables like {variable} in subjects and bodies - they are replaced with book details at send time.", "deleteTitle": "Delete template?", "nameSubjectRequired": "Name and subject are required", "created": "Template created", "updated": "Template updated", "deleted": "\"{name}\" deleted", "setDefaultSuccess": "\"{name}\" set as default" }, "preferences": { "heading": "Email Preferences", "defaultProvider": "Default provider", "defaultProviderHint": "Used when no provider is specified. If empty, the account default is used.", "noneAccountDefault": "None (use account default)", "defaultRecipient": "Default recipient", "defaultRecipientHint": "Used for quick send. Must be set to use the quick-send action on book cards.", "none": "None", "defaultTemplate": "Default template", "defaultTemplateHint": "Used when no template is specified. Falls back to the system default if empty.", "noneSystemDefault": "None (use system default)", "save": "Save preferences", "saved": "Preferences saved" }, "history": { "heading": "Send History", "empty": "No emails sent yet.", "noSubject": "(no subject)", "loadMore": "Load more", "resend": "Resend", "deleteTitle": "Delete history entry?", "entryDeleted": "Entry deleted", "queuedForResend": "Queued for resend", "resendFailed": "Failed to resend", "statusSent": "Sent", "statusFailed": "Failed", "statusQueued": "Queued", "statusPending": "Pending" }, "send": { "title": "Send via Email", "bookCount": "{count, plural, =0 {no books} one {one book} other {# books}}", "recipients": "Recipients", "noRecipients": "No recipients configured. Add one in Email settings.", "groups": "Groups", "options": "Options", "fileFormat": "File format", "autoRecipientPreference": "Auto (use recipient preference)", "unknownFormat": "Unknown", "primarySuffix": "(primary)", "provider": "Provider", "template": "Template", "default": "Default", "send": "Send", "sending": "Sending...", "queued": "{count, plural, =0 {no emails queued} one {one email queued} other {# emails queued}}", "failed": "Failed to send" }, "page": { "addRecipient": "Add recipient", "recipients": "Recipients", "groups": "Groups", "newGroup": "New group", "servers": "Mail servers", "addServer": "Add mail server", "templates": "Templates", "newTemplate": "New template", "noServersReadonly": "No mail server is shared with you yet. Ask an administrator to add one.", "roleShared": "Shared with everyone", "roleSystem": "Password resets", "cantConnect": "Can't connect", "builtIn": "Built in", "recipientsEmptyTitle": "Add the e-reader or inbox you send books to", "recipientsEmptyBody": "A Kindle's address ends in {kindle} and is listed under Devices in your Amazon account. A PocketBook's ends in {pocketbook}. Any ordinary inbox works too.", "kindleNote": "Kindle only takes mail from approved senders. Add {address} under Personal Document Settings in your Amazon account.", "copyAddress": "Copy address", "addressCopied": "Address copied", "editServer": "Edit {name}", "editTemplate": "Edit {name}", "editGroup": "Edit {name}", "groupCount": "{count, plural, one {# recipient} other {# recipients}}", "recipientsHint": "The starred one is picked when you send.", "groupsHint": "Send to several recipients at once.", "groupsEmpty": "No groups yet.", "serversHint": "The starred one sends your books.", "templatesHint": "The subject and message sent with each book.", "kindleTemplateNote": "A Kindle never shows the template: its email always goes out with the subject {subject}.", "test": "Test", "testServer": "Test {name}", "testOk": "{name} connected", "testFailed": "{name} can't connect", "defaultRecipient": "Default recipient", "makeDefaultRecipient": "Make {name} the default recipient", "defaultServer": "Default server", "makeDefaultServer": "Make {name} the default server", "defaultTemplate": "Default template", "makeDefaultTemplate": "Make {name} the default template", "editRecipient": "Edit {name}", "serversEmptyTitle": "No mail server yet", "serversEmptyBody": "Books go out through an SMTP account. Gmail, Outlook, iCloud and Fastmail are one click; any other server works too.", "needServerTitle": "Add a mail server before you can send", "needServerBody": "BookOrbit sends books through an SMTP account you own, such as Gmail with an app password.", "needServerAsk": "Ask an administrator to share a mail server with you.", "goToServers": "Go to Mail servers", "noEncryption": "No encryption" }, "route": { "defaultSaved": "Default updated" }, "attention": { "title": "Needs attention", "count": "{count, plural, one {# item} other {# items}}", "hide": "Hide", "show": "Show", "serverDown": "{name} can't connect", "notDelivered": "{book} did not reach {recipient}", "maybeDelivered": "{book} may not have reached {recipient}", "testedAgo": "tested {time}", "editServer": "Edit server", "editRecipient": "Edit recipient", "resend": "Resend" }, "reason": { "tooLarge": "{size} is more than {server} accepts.", "tooLargeGmail": "{size} is over Gmail's 25 MB attachment limit.", "tooLargeFix": "Send a smaller edition, or set the recipient to text-only EPUBs.", "signIn": "{server} refused the sign-in.", "signInFix": "Check the username and password on the mail server.", "unreachable": "{server} did not answer.", "unconfirmed": "The connection dropped after the message was handed over, so it may have arrived.", "unconfirmedFix": "Check the inbox before resending, or it may arrive twice.", "interrupted": "BookOrbit restarted while this email was going out.", "interruptedFix": "Check the inbox before resending.", "preparation": "The file could not be prepared for sending.", "other": "The mail server turned it down.", "server": "the mail server", "serverMessage": "Server message", "retryAt": "Next try {time}." }, "status": { "sent": "Sent", "sending": "Sending", "retrying": "Retrying · {attempt} of {total}", "unconfirmed": "Unconfirmed", "failed": "Failed" }, "recent": { "moreActions": "More actions for {title}", "deletedBook": "Deleted book", "openBook": "Open book", "resend": "Resend", "delete": "Delete entry" }, "log": { "all": "All", "attention": "Needs attention", "active": "In progress", "book": "Book", "sentTo": "Sent to", "file": "File", "status": "Status", "when": "When", "sentMeans": "Sent means your mail server accepted it", "emptyFilter": "Nothing here right now.", "loadMore": "Load more", "showing": "Showing {shown} of {total}", "emptyTitle": "Nothing sent yet", "emptyBody": "Books you email show up here with where they went and whether the mail server took them." }, "card": { "nothingSent": "Nothing sent yet", "failed": "failed", "retrying": "retrying", "unconfirmed": "unconfirmed", "sending": "sending", "narration": "Narration", "narrationTitle": "Read-aloud books keep their narration" }, "device": { "kindle": "Kindle", "kobo": "Kobo", "other": "Other e-reader", "otherShort": "E-reader", "none": "Person or inbox" }, "sheet": { "title": "Send by email", "sendTo": "Send to", "groups": "Groups", "templateName": "{name} template", "eachFormat": "Each recipient's format", "formatForAll": "{format} for everyone", "file": "File", "mailServer": "Mail server", "template": "Template", "yourDefault": "your default", "emails": "{count, plural, one {# email} other {# emails}}", "noOnePicked": "No one picked", "total": "{size} in total", "send": "{count, plural, one {Send} other {Send # emails}}", "noFormat": "No {format}, gets {got}", "readAlong": "Read-aloud, {size}", "overKindle": "{size}, over Kindle's 50 MB limit", "overGmail": "{size}, over Gmail's 25 MB limit", "kindleRejects": "Kindle rejects {format}", "blockedKindle": "{name} can't take {format}. Pick EPUB or PDF, or untick it.", "books": "{count, plural, one {# book} other {# books}}", "notReadyTitle": "Email is not set up yet", "notReadyBody": "Before a book can go anywhere, this account needs a mail server and a recipient.", "addServer": "Add a mail server", "addServerHint": "Gmail, Outlook, iCloud, Fastmail or any SMTP account.", "askForServer": "Ask an administrator to share a mail server.", "addRecipient": "Add a recipient", "addRecipientHint": "Your Kindle, PocketBook or any inbox.", "openSettings": "Open email settings", "sendingTitle": "Sending {title}", "closeHint": "You can close this. Failures also show up in your notifications and in your email history.", "openHistory": "Open history", "done": "Done", "acceptedBy": "Accepted by {server} {time}", "handingOver": "Handing over to {server}" }, "editor": { "kindleSubject": "convert", "recipient": { "newTitle": "New recipient", "description": "The recipient's name, address, device and what it receives.", "sectionRecipient": "Recipient", "sectionReceives": "What it receives", "name": "Name", "email": "Email address", "device": "Device", "deviceHint": "Kindle changes the subject to {subject} and limits the formats below.", "format": "Format", "formatPrimary": "Book's primary", "formatHint": "A book without this format gets its primary edition.", "kindleFormatHint": "Amazon stopped accepting MOBI and AZW3 by email in 2023, so they are not offered for a Kindle. A book without this format gets its primary edition.", "kindleLegacyFormat": "Kindle no longer accepts {format} by email. Pick EPUB or PDF.", "readAlong": "Read-aloud books", "readAlongAutomatic": "Automatic", "readAlongAutomaticHint": "Text-only when a safe copy can be made, otherwise the original.", "readAlongTextOnly": "Text-only EPUB", "readAlongTextOnlyHint": "Narration stripped. Small enough for email.", "readAlongOriginal": "Original with narration", "readAlongOriginalHint": "Keeps the narration. Often 100 MB or more, over most mail servers' limits.", "notForKindle": "Not for Kindle", "template": "Template", "templateDefault": "Your default ({name})", "templateKindleHint": "Ignored for Kindle, which never shows the message.", "approveTitle": "Approve the sender in Amazon", "approveBody": "Kindle drops email from addresses it does not know, without a bounce. In {path}, add {address}", "approvePath": "Manage Your Content and Devices › Preferences › Personal Document Settings", "approveNoServer": "Add a mail server first to see the address Kindle must approve.", "lastSent": "Last book sent {time}", "sendTest": "Send a test email", "testSubject": "BookOrbit test email", "testBody": "This is a test from BookOrbit. If you can read it, books sent to {name} will arrive here too.", "testSent": "Test email sent to {name}", "testFailed": "The test email did not go out: {error}", "makeDefault": "Make Quick send recipient", "remove": "Delete recipient", "removeConfirm": "Delete {name}?", "removeConsequence": "Its send history stays.", "removeDefaultConsequence": "Its send history stays, and Quick send stops until you star another recipient.", "required": "Name and email address are required.", "sectionLastSent": "Last sent" }, "server": { "newTitle": "New mail server", "description": "The SMTP server, its sign-in and who can send through it.", "sectionProvider": "Provider", "sectionServer": "Server", "sectionSignIn": "Sign in", "sectionSender": "Sender", "sectionWho": "Who uses it", "presetGmail": "Gmail", "presetOutlook": "Outlook", "presetIcloud": "iCloud Mail", "presetFastmail": "Fastmail", "presetOther": "Other SMTP", "presetHint": "A preset fills in the host, port and security. You can still change them.", "name": "Name", "host": "Host", "port": "Port", "security": "Security", "securityStarttls": "STARTTLS", "securitySsl": "SSL/TLS", "securityNone": "None", "securityHint": "STARTTLS on 587, SSL/TLS on 465. One or the other, never both.", "needsPassword": "This server needs a password", "username": "Username", "password": "Password", "appPassword": "App password", "passwordKeep": "Saved. Type to replace it", "appPasswordHint": "Gmail and iCloud need an app password, not your account password.", "fromName": "From name", "fromAddress": "From address", "fromAddressHint": "Kindle owners must approve this address.", "share": "Share with everyone", "shareHint": "Other people can send books through this server without seeing the password.", "system": "Send password resets and sign-in links", "systemHint": "The one server BookOrbit itself uses. Only a superuser can change this.", "verifyTls": "Verify the server certificate", "verifyTlsHint": "Turn off only for a server on your own network with a self-signed certificate.", "test": "Test connection", "testDirty": "Save first, then test", "testOk": "Connected", "testFailed": "Can't connect: {error}", "remove": "Delete server", "removeConfirm": "Delete {name}?", "removeConsequence": "Everyone it is shared with loses it.", "removeSystemFirst": "Turn off password resets on this server before deleting it.", "makeDefault": "Use as my default", "required": "Name and host are required." }, "template": { "newTitle": "New template", "description": "The subject and message sent with each book.", "sectionTemplate": "Template", "sectionInsert": "Insert", "sectionPreview": "Preview", "name": "Name", "subject": "Subject", "message": "Message", "groupBook": "Book", "groupFile": "File", "groupOther": "Other", "insertHint": "Goes in at the cursor, in the subject or the message. Empty values print nothing.", "insertVariable": "Insert {variable}", "previewWith": "Preview with", "previewEmpty": "Send a book once to preview a template with it.", "previewFailed": "The preview could not be rendered.", "previewTo": "To", "builtInReadonly": "Built in. Only a superuser can change it.", "kindleNote": "Kindle never shows a template: it always gets the subject {subject}.", "makeDefault": "Make my default", "remove": "Delete template", "removeConfirm": "Delete {name}?", "removeConsequence": "Recipients that use it go back to your default template.", "required": "Name and subject are required.", "attachment": "Attached: {name}" }, "group": { "newTitle": "New group", "description": "A set of recipients to send one book to at once.", "sectionGroup": "Group", "sectionMembers": "Members", "name": "Name", "memberCount": "{count} of {total}", "noRecipientsTitle": "No recipients to pick from", "noRecipientsBody": "A group is a set of recipients. Add a recipient first.", "remove": "Delete group", "removeConfirm": "Delete {name}?", "removeConsequence": "Its recipients stay.", "required": "A group needs a name.", "updated": "Group updated" } } }, "errors": { "network": "Could not reach BookOrbit. Check your connection, then try again.", "codes": { "CHAPTERS_STALE": "Someone else changed these chapters. Reload to see their version.", "CHAPTERS_EMPTY_TITLE": "Every chapter needs a title.", "CHAPTERS_FIRST_NOT_ZERO": "The first chapter has to start at 0:00.", "CHAPTERS_NOT_ASCENDING": "Chapters have to start in order, each after the one before.", "CHAPTERS_PAST_END": "A chapter starts after the audiobook ends.", "CHAPTERS_FILES_UNREADABLE": "An audio file could not be read, so its chapters are unknown.", "CHAPTERS_LOOKUP_NOT_FOUND": "Audible has no chapters for that ASIN in this store.", "CHAPTERS_LOOKUP_UNAVAILABLE": "Audible did not answer. Try again in a moment.", "CHAPTERS_EBOOK_UNAVAILABLE": "That ebook has no chapter list to read.", "CHAPTERS_ANALYSIS_TOO_LARGE": "That is too much audio to analyze at once.", "CHAPTERS_ANALYSIS_UNAVAILABLE": "Finding pauses needs ffmpeg on the server.", "CHAPTERS_WRITE_UNAVAILABLE": "Chapters can't be written into these files.", "CHAPTERS_NOTHING_TO_WRITE": "There are no saved chapters to write." } }, "hardcover": { "settings": { "subtitle": "Sync your reading progress, status, and ratings to Hardcover." }, "bookSync": { "label": "Hardcover Sync", "toggleAriaLabel": "Sync this book with Hardcover", "syncNow": "Sync now" }, "connection": { "title": "Connection", "description": "Connect your Hardcover account to sync reading data.", "connected": "Connected", "apiToken": "API Token", "tokenPlaceholder": "Paste your Hardcover API token", "show": "Show", "hide": "Hide", "findTokenAt": "Find your token at", "validateToken": "Validate token", "valid": "Valid ({username})", "invalidToken": "Invalid token", "syncOptions": "Sync options", "syncInfo": "Sync runs only for books that are not unread. This applies to status, progress, and rating triggers. These switches control when a sync runs.", "syncScope": { "title": "Book sync scope", "allEligible": { "label": "All eligible books", "description": "Sync everything unless you exclude a book." }, "selectedOnly": { "label": "Selected books only", "description": "Sync only books you explicitly include." } }, "enableSync": { "title": "Enable sync", "description": "Pause all Hardcover syncing without disconnecting." }, "syncOnStatus": { "title": "Sync on status change", "description": "Push updates when you mark a book as reading, read, etc." }, "syncOnProgress": { "title": "Sync on progress update", "description": "Push reading progress and dates when BookOrbit or KOReader progress changes." }, "syncOnRating": { "title": "Sync on rating change", "description": "Push your star ratings to Hardcover." }, "privacy": { "title": "Privacy", "description": "Default visibility for synced books on Hardcover.", "public": "Public", "followersOnly": "Followers only", "private": "Private" }, "disconnect": "Disconnect", "toast": { "enterToken": "Enter your Hardcover API token first", "saved": "Hardcover settings saved", "saveFailed": "Failed to save settings", "disconnected": "Hardcover disconnected" } }, "sync": { "title": "Manual sync", "description": "Push your {scope} to Hardcover now.", "scope": { "selected": "selected books", "eligible": "eligible books" }, "checkingPending": "Checking pending items...", "pendingOf": "{pending} pending of {total} books.", "noBooksInScope": "No books in sync scope.", "allSynced": "All books are already synced.", "lastSyncedLabel": "Last synced", "lastSuccessfulSync": "Last successful sync", "syncing": "Syncing...", "progressCount": "{synced} / {total} books", "unavailable": { "permissionDenied": "You do not have permission to use Hardcover sync.", "userDisabled": "Sync is paused in your Hardcover settings." }, "button": { "unavailable": "Sync unavailable", "syncNow": "Sync now", "syncNowCount": "Sync now ({count})" }, "lastSynced": { "justNow": "Just now", "minutesAgo": "{count} min ago", "hoursAgo": "{count, plural, =0 {# hour ago} one {# hour ago} other {# hours ago}}", "daysAgo": "{count, plural, =0 {# day ago} one {# day ago} other {# days ago}}" } }, "import": { "title": "Pull read status", "description": "Preview Hardcover matches before filling blank BookOrbit statuses.", "clear": "Clear", "preview": "Preview", "importProgress": "Import progress", "reviewMatches": "Review matches", "importReady": "Import ready", "exactMatches": "{count, plural, =0 {no exact matches can be imported without review} one {# exact match can be imported without review} other {# exact matches can be imported without review}}", "progressAvailable": "{count, plural, =0 {no progress updates available} one {# progress update available} other {# progress updates available}}", "progressConflicts": "{count, plural, =0 {no conflicts} one {# conflict} other {# conflicts}}", "unavailable": { "permissionDenied": "You do not have permission to use Hardcover sync.", "missingToken": "Connect Hardcover before importing.", "userDisabled": "Sync is paused in your Hardcover settings." }, "summary": { "ready": "Ready", "review": "Review", "conflicts": "Conflicts", "unmatched": "Unmatched", "skipped": "Skipped" }, "result": { "summary": "{applied} imported{progress}, {failed} failed", "progressUpdated": "{count} progress updated" }, "toast": { "importFailed": "Failed to import Hardcover read status", "imported": "{count, plural, =0 {no read statuses imported{progress}} one {# read status imported{progress}} other {# read statuses imported{progress}}}", "progressUpdates": "{count, plural, =0 {no progress updates} one {# progress update} other {# progress updates}}" } }, "review": { "title": "Hardcover import review", "subtitle": "{total} Hardcover books, {matched} matched.", "closeAriaLabel": "Close import review", "searchPlaceholder": "Search title or author", "importProgress": "Import progress", "untitled": "Untitled", "blank": "blank", "noRows": "No rows match the current filters.", "selectRowAriaLabel": "Select {title}", "selectionSummary": "{count} selected: {ready} ready, {reviewed} reviewed.", "selectedProgress": "{count, plural, =0 {no progress updates} one {# progress update} other {# progress updates}}", "selectReady": "Select ready", "selectPage": "Select page", "clearPage": "Clear page", "clearSelection": "Clear selection", "importSelected": "Import selected", "previousPage": "Previous page", "nextPage": "Next page", "pageRange": "{start}-{end} of {total}", "tabs": { "all": "All", "ready": "Ready", "review": "Review", "conflicts": "Conflicts", "unmatched": "Unmatched", "skipped": "Skipped" }, "summary": { "ready": "Ready", "review": "Review", "conflicts": "Conflicts", "unmatched": "Unmatched", "skipped": "Skipped" }, "matchOptions": { "all": "All match types" }, "matchMethod": { "hardcoverId": "Hardcover ID", "isbn": "ISBN", "titleAuthor": "Title + author" }, "outcome": { "ready": "Ready", "review": "Review", "conflict": "Conflict", "unmatched": "Unmatched", "skipped": "Skipped" }, "column": { "progress": "Progress" } }, "linkedBooks": { "title": "Linked books", "description": "Shows books you're currently reading. Once a book is matched to Hardcover, pick a different edition (physical, ebook, audiobook) here to change what your reading progress syncs against.", "loading": "Loading books...", "loadError": "Failed to load books.", "retry": "Retry", "empty": "No books currently being read.", "untitled": "Untitled", "unknownAuthor": "Unknown author", "matchMethod": { "isbn": "ISBN", "title": "Title", "cached": "Cached", "manual": "Manual", "metadata_id": "Metadata match" }, "status": { "error": "Error: {error}", "linked": "Linked", "linkedWithMethod": "Linked ({method})", "notLinked": "Not linked yet" }, "unmatchedHint": "This book hasn't been matched to Hardcover yet. It will be matched automatically the next time it syncs.", "editionsLoadError": "Failed to load editions.", "viewEditions": "View editions", "noEditionsFound": "No editions found.", "booksTruncated": "Showing the first {count} books you're reading.", "editionsTruncated": "Showing the first {count} editions.", "pages": "{count, plural, one {# page} other {# pages}}", "isbn": "ISBN {isbn}", "current": "Current", "useThis": "Use this", "toast": { "switched": "Switched to {format}", "switchFailed": "Failed to switch edition" } } }, "library": { "creator": { "createTitle": "Create Library", "editTitle": "Edit: {name}", "stepOf": "Step {current} of {total}", "unsaved": "Unsaved", "required": "Required", "closeAria": "Close library creator", "progressAria": "Library setup progress", "sectionsAria": "Library settings sections", "loadingAria": "Loading library settings", "sections": { "details": "Details", "folders": "Folders", "scanner": "Scanner", "metadata": "Metadata", "fileWrite": "File Write", "reading": "Reading", "schedule": "Schedule", "access": "Access" }, "actions": { "saving": "Saving…", "saveChanges": "Save changes", "creating": "Creating…", "createLibrary": "Create library" }, "details": { "libraryName": "Library name", "namePlaceholder": "My Library", "coverStyle": { "title": "Cover style", "portrait": "Portrait", "square": "Square", "hint": "Portrait for ebook or mixed libraries. Square for audiobook-only libraries.", "hintSlots": "Portrait for ebook or mixed libraries, square for audiobook-only libraries. A book with both an ebook and an audiobook shows its book cover in a portrait library and its audiobook cover in a square one." }, "icon": { "label": "Icon", "placeholder": "Choose an icon...", "selected": "Selected", "more": "More icons" }, "identity": "Identity", "cover": { "portraitTitle": "Portrait 2:3", "portraitHint": "Ebooks and mixed libraries", "squareTitle": "Square 1:1", "squareHint": "Audiobook-only libraries", "slotsHint": "A book with both an ebook and an audiobook shows the cover that fits this shape." }, "gridShape": { "title": "Grid shape", "tallTitle": "Tall cells", "tallHint": "Best for ebooks or mixed libraries", "squareTitle": "Square cells", "squareHint": "Best for audiobook libraries", "hint": "Each book shows the cover of its primary format, square for an audiobook. A cover that doesn't match the tile follows your cover display setting." } }, "folders": { "title": "Scan folders", "description": "Add one or more directories to scan for books.", "browseAdd": "Browse and add a folder", "browseTitle": "Browse server folders", "browseDescription": "Select one or more folders without leaving the browser.", "selectedTitle": "Selected folders", "addFolders": "Add folders", "absolutePath": "Absolute server path", "removeFolder": "Remove {folder}", "manualCheckHint": "Manual paths are checked together with the rest of the selected folders.", "pathPlaceholder": "/path/to/books", "test": "Test", "add": "Add", "pathNotAccessible": "Path is not accessible on the server.", "pathAccessible": "Path is accessible.", "pathNotAccessibleShort": "Path is not accessible", "overlapsWith": "Overlaps with \"{library}\"", "noneAdded": "No folders added yet", "runPrescanHint": "Run a prescan to validate paths before saving.", "scanning": "Scanning…", "prescan": "Prescan", "listTitle": "Folders", "matchingFiles": "{count, plural, one {# matching file} other {# matching files}}", "bookCount": "{count, plural, one {# book} other {# books}}", "checkAll": "Check folders again", "checkAgain": "Check {folder} again", "checkHint": "Each folder is checked as soon as you add it. A folder another library already reads is flagged, because both libraries would import the same files.", "emptyHint": "Paste a server path below, or browse for one.", "pastePlaceholder": "Paste a server path, e.g. /books/Sci-Fi", "browse": "Browse...", "status": { "checking": "Checking", "failed": "Check failed", "notAccessible": "Not accessible", "overlap": "Also in {library}", "overlapTitle": "The library \"{library}\" already reads this folder.", "files": "{count, plural, one {# file} other {# files}}" }, "errors": { "empty": "Enter a server folder path.", "notAbsolute": "Enter an absolute server path beginning with /.", "duplicate": "That folder has already been added.", "covered": "That folder is already covered by {path}." } }, "scanner": { "scanMode": { "title": "Scan mode", "lockedAria": "Organization mode is locked", "lockTooltip": "Organization mode is fixed after library creation because changing it can create duplicate or missing book entries. To use a different mode, create a new library and rescan.", "recommended": "Recommended", "folderAsBook": { "title": "Folder as Book", "hint": "All files in a folder are grouped into one book. Works well when you keep multiple formats, like EPUB and MOBI, together." }, "fileAsBook": { "title": "File as Book", "hint": "Treats every file as an individual book. Best suited for libraries with one format per title. Avoid if your audiobooks span multiple files." }, "seriesFolders": { "title": "Series folders", "uses": "Uses File as Book" } }, "addedAt": { "title": "Date added", "hint": "Choose what a book's \"date added\" reflects. This applies to books imported from now on.", "options": { "imported": { "title": "When imported", "hint": "The date BookOrbit first imported the book. This is the default." }, "file_modified": { "title": "File modified time", "hint": "The file's last-modified time (mtime), often preserved when files are copied." }, "file_created": { "title": "File creation time", "hint": "When the file first landed on disk (birthtime). Falls back to modified time on filesystems that don't record creation time." } }, "recompute": "Recompute now", "recomputing": "Recomputing...", "recomputeHint": "Update the date added for existing books using this setting.", "recomputeSaveFirst": "Save your changes first, then recompute existing books.", "backgroundConfirm": "Recompute dates for existing books? This runs in the background, and you can close this editor. Books with unreadable files keep their current date.", "progressSummary": "Processed {processed} of {total}: {updated} updated, {unchanged} unchanged, {skipped} skipped, {failed} failed.", "failedBooksHint": "Failed books kept their dates. Check file access, then run recompute again to retry.", "jobStatus": { "running": "Recomputing dates in the background.", "completed": "Date recompute finished.", "failed": "Recompute stopped before finishing. Completed changes were kept; you can safely run it again." }, "errors": { "sourceImported": "Save a file timestamp source before recomputing dates.", "alreadyRunning": "A recompute is already running for this library.", "busy": "Other recomputes are running. Try again shortly.", "requestFailed": "Could not reach the recompute service. Close and reopen this editor to check its status.", "interrupted": "The job status is no longer available. It may have been interrupted by a server restart. You can safely run recompute again." }, "failureSample": "Book {bookId}: {reason}", "failureReasons": { "file_unavailable": "A content file could not be read.", "unsafe_path": "A content file is outside its permitted library folder.", "database_error": "The database update failed." } }, "allowedFormats": { "title": "Allowed formats", "allowAll": "Allow all", "allAllowed": "All formats are allowed.", "onlySelected": "Only the selected formats will be imported.", "warning": "Books in other formats already in the library will be marked as missing on the next scan." }, "excludePatterns": { "title": "Exclude patterns", "hintBefore": "Glob patterns to skip during scanning (e.g. ", "hintAfter": ").", "add": "Add", "empty": "No patterns added." }, "mode": { "title": "How files become books", "locked": "Set at creation", "cannotChange": "This is the one setting you cannot change later.", "folderHint": "Every folder is one book. Best when a title keeps several formats together, or an audiobook spans many files.", "fileHint": "Every file is its own book. Best for flat folders with one format per title.", "fileHintSeries": "Every file is its own book. Best for comics and manga kept in one folder per series, or a flat folder with one format per title.", "folderResult": "One book with two formats", "fileResult": "Three books, one per file", "seriesHint": "Every file is its own book, and the folder it sits in is its series, the layout Komga and Kavita use. Best for comics and manga.", "seriesResult": "Two series, one book per file" }, "import": { "title": "Import", "all": "All formats", "some": "Only these", "groups": { "ebook": "Ebooks", "kindle": "Kindle", "document": "Documents", "comic": "Comics", "audio": "Audio" } }, "skip": { "title": "Skip files matching", "count": "{count, plural, one {# pattern} other {# patterns}}", "hint": "Glob patterns, matched against paths inside the library folders.", "inputLabel": "Pattern to skip", "placeholder": "Type a pattern like **/samples/** and press Enter", "placeholderMore": "Add another pattern", "remove": "Remove pattern {pattern}" }, "series": { "title": "Series", "toggle": "Folders are series", "hintOn": "Each folder becomes a series, and the number in each file name sets the book's place in it, as Komga and Kavita do. A different series named inside a file still comes first.", "hintOff": "Turn this on for comics and manga kept in one folder per series, so each folder names the series of the files inside it.", "replacesCustom": "Turning this on replaces the path rules set under Metadata. Turning it off again before you save brings them back.", "existingBooks": "Books already in this library get these series when you apply the rules to them under Metadata.", "previewSeries": "Series" } }, "metadata": { "sourcePrecedence": { "title": "Source precedence", "hint": "The highest source in the list is preferred when multiple are available." }, "formatPriority": { "title": "Format priority", "hint": "When a book has multiple formats, the format highest in the list is preferred." }, "moveUp": "Move {item} up", "moveDown": "Move {item} down", "primary": { "title": "Primary file", "hint": "When a book has several files, the first format in this order becomes its primary file: the one that opens first and supplies the book's details. Drag a row, or use the arrows.", "reset": "Reset order", "first": "First choice", "notImported": "Not imported", "notHeld": "{count, plural, one {# format this library does not hold keeps its default place after these.} other {# formats this library does not hold keep their default order after these.}}", "moreBelow": "{count, plural, one {# more format follows in this order.} other {# more formats follow in this order.}}", "showingAll": "Showing every format.", "showAll": "Show all {count}", "showFewer": "Show fewer" }, "source": { "title": "Book details come from", "embeddedTitle": "Tags in the book file", "embeddedHint": "Read from the primary file", "opfTitle": "metadata.opf file", "opfHint": "Saved next to the book by Calibre", "swap": "Swap the order", "hint": "BookOrbit uses the first one a book has and ignores the other. Calibre libraries usually want metadata.opf first." }, "regex": { "title": "Configure regex metadata", "sourceTitle": "Regex", "description": "Extract metadata from the primary file path relative to its library folder. The file extension is removed before matching. The first rule with usable fields wins.", "enable": "Enable regex metadata", "primaryFileHint": "For a book made of several files, such as audiobook tracks, the rules read the primary file's path.", "groups": "Named groups:", "valuesHint": "Use author for one author or authors separated by semicolons. Dates use YYYY-MM-DD. Flags: i ignores case, u enables Unicode.", "rules": "Ordered extraction rules", "rule": "Rule {number}", "moveUp": "Move rule up", "moveDown": "Move rule down", "remove": "Remove rule", "basePath": "Library folder", "extensionHint": "The file extension is automatically ignored. The end anchor matches the filename without its extension.", "flags": "Flags", "add": "Add rule", "examplePath": "Example relative file path, including extension", "examplePlaceholder": "Author/Series/08 - My.Book.epub", "exampleTitle": "Example with an author backreference", "exampleTestPath": "Test path (including extension)", "validating": "Checking rules…", "validationSuccess": "Rule syntax and groups are valid. Use the preview to check matches for a file path.", "validationError": "Could not validate the rules. Try again before applying them.", "validationRetry": "Check again", "validationRuleCount": "Add between {min} and {max} rules.", "preview": "Preview", "previewing": "Testing rules…", "previewError": "Could not preview the rules. Check the relative path and configuration, then try again.", "actualInput": "Path tested:", "matched": "Matched rule {number}", "noMatch": "No usable match. File metadata will be used.", "scanHint": "Changes apply to future metadata extraction for new or changed files. Saving does not start a scan or update unchanged books.", "apply": "Apply to library form", "configure": "Configure", "enabledHint": "Extract fields from relative paths without file extensions.", "disabledHint": "Disabled. Configure rules to enable.", "moveSourceUp": "Move {source} up", "moveSourceDown": "Move {source} down", "diagnostics": { "pattern_required": "Enter a regular expression.", "pattern_too_long": "The expression must not exceed {count} characters.", "invalid_flags": "Only i and u are allowed, each at most once.", "invalid_pattern": "Invalid regular expression.", "missing_group": "Include at least one supported named group.", "conflicting_authors": "Use either author or authors, not both.", "invalid_value": "An invalid field value was skipped.", "timeout": "The expression took too long. Simplify the pattern.", "busy": "All preview workers are busy. Try again shortly.", "worker_failed": "The expression could not be evaluated. Try again." }, "precedenceHint": "The first available file source supplies metadata. Regex fields follow this order and missing values are filled from the other source.", "summary": "{format} first, regex metadata preferred", "fields": { "title": "Title", "authors": "Authors", "series": "Series", "seriesIndex": "Series number", "publishedYear": "Published year", "publishedDate": "Published date" }, "preset": { "title": "Folders are series", "hint": "Rules for one folder per series and one file per volume, chapter or issue, as Komga and Kavita expect. They replace the rules below.", "apply": "Use these rules" }, "reapply": { "action": "Apply rules to existing books", "applying": "Applying rules...", "hint": "Updates books already in this library with the fields these rules decide. Nothing else changes, and locked fields are kept.", "saveFirst": "Save your changes first, then apply the rules to existing books.", "confirm": "Apply the saved rules to every book in this library? This runs in the background, and you can close this editor. Only fields the rules decide are written; locked fields and metadata the files supply themselves are kept.", "progressSummary": "Processed {processed} of {total}: {updated} updated, {unchanged} unchanged, {skipped} skipped, {failed} failed.", "jobStatus": { "running": "Applying rules in the background.", "completed": "Rules applied to existing books.", "failed": "Applying stopped before finishing. Changes already made were kept; you can safely run it again." }, "errors": { "notConfigured": "Save path rules for this library before applying them.", "alreadyRunning": "The rules are already being applied to this library.", "busy": "Other libraries are applying rules. Try again shortly.", "requestFailed": "Could not reach the server. Close and reopen this editor to check the status.", "interrupted": "The job status is no longer available. It may have been interrupted by a server restart. You can safely run it again." }, "failureSample": "Book {bookId}: {reason}", "failureReasons": { "rules_unavailable": "The rules could not be evaluated in time.", "rules_invalid": "The saved rules could not be run. Open Configure, check them, and save again.", "file_unavailable": "The book's file could not be read, so nothing was changed. Check that the library folder is reachable.", "metadata_failed": "The book's metadata could not be saved." } } } }, "fileWrite": { "maxFileSizeMb": "Max file size (MB)", "formatLimits": "Format limits", "rename": { "title": "Rename files after metadata changes", "hint": "Renames physical files when title, author, series, or year changes, using the library naming pattern." }, "write": { "title": "Write metadata to files", "hint": "When enabled, saving metadata will also write changes back into the physical file on disk." }, "cover": { "title": "Include cover image", "hint": "Writes the stored cover back into supported file formats.", "mediumHint": "Writes the stored cover into the file too. Ebook files get the Book cover and audio files get the Audiobook cover; a file whose cover is missing keeps its own." }, "allFiles": { "title": "Write into every file of a book", "hint": "Also writes into the book's other book files, such as an audiobook kept beside its ebook or a PDF in the same folder. Every book format there is written, so give a companion file such as a workbook its own folder to keep it out. Format toggles and size limits below still apply. Turning this off stops future writes; it does not undo files already written." }, "epub": { "title": "EPUB", "hint": "Writes metadata into the OPF file inside the EPUB archive.", "toggleAria": "Write EPUB metadata" }, "readAlong": { "title": "Read-aloud EPUB", "hint": "EPUBs with synced narration, such as Storyteller read-alouds. They carry their audio, so they are large and need more memory to rewrite.", "toggleAria": "Write read-aloud EPUB metadata" }, "fb2": { "title": "FictionBook (FB2)", "hint": "Rewrites the description block inside FB2 files, leaving the book text untouched.", "toggleAria": "Write FB2 metadata" }, "pdf": { "title": "PDF", "hint": "Embeds metadata into PDF Info dictionary and XMP stream.", "toggleAria": "Write PDF metadata" }, "cbx": { "title": "Comic archives (CBX)", "hint": "Writes ComicInfo.xml into CBZ and CB7 archives.", "toggleAria": "Write comic archive metadata" }, "kindle": { "title": "Kindle (MOBI, AZW3)", "hint": "Writes metadata into the EXTH header of MOBI, AZW3, and AZW files.", "toggleAria": "Write Kindle metadata" }, "audio": { "title": "Audio", "hint": "Embeds the stored cover into M4B, M4A, MP3, and FLAC files.", "toggleAria": "Write audio covers", "tagsHint": "Writes tags such as title, authors, narrators, and series into M4B, M4A, MP3, and FLAC files.", "tagsToggleAria": "Write audio metadata" }, "coverAudioHint": "Writes the stored cover into the file too. Audio files can only take a cover.", "audioNeedsCover": "Needs “Include cover image” turned on.", "table": { "format": "Format", "inLibrary": "Here", "sizeLimit": "Size limit" }, "sizeLimitAria": "{format} size limit in MB", "mb": "MB", "summary": "{count, plural, =0 {No file types are written.} one {# kind of file is written. Files over their size limit are skipped.} other {# kinds of file are written. Files over their size limit are skipped.}}" }, "reading": { "readingStart": { "title": "Reading start", "hint": "A book is marked as \"reading\" once this percentage of progress is reached." }, "markAsFinished": { "title": "Mark as finished", "hint": "A book is automatically marked as \"read\" when this percentage of progress is reached.", "invalidThreshold": "Finished progress must be between 90% and 100%." }, "statusTitle": "Reading status", "zones": { "notStarted": "Not started", "reading": "Reading", "read": "Read" }, "range": "Between {min} and {max}.", "startSlider": "Drag to set when a book counts as started", "finishSlider": "Drag to set when a book counts as finished" }, "schedule": { "fileWatching": "File watching", "autoScanSchedule": "Auto-scan schedule", "timezoneHint": "Schedules run in the server's timezone.", "cronExpression": "Cron expression", "cronInvalid": "Invalid cron expression.", "cronFormat": "Format: minute hour day month weekday", "watchFolders": { "title": "Watch folders", "hint": "Automatically detect new files added to library folders." }, "presets": { "never": "Never", "hourly": "Every hour", "every6Hours": "Every 6 hours", "every12Hours": "Every 12 hours", "daily": "Daily", "weekly": "Weekly", "custom": "Custom" }, "human": { "disabled": "Auto-scan disabled", "invalid": "Enter a valid schedule to see a preview", "hourly": "Every hour", "every6Hours": "Every 6 hours", "every12Hours": "Every 12 hours", "dailyMidnight": "Daily at midnight", "weeklyMonday": "Weekly on Monday at midnight", "cron": "Cron: {cron}" } }, "access": { "title": "Access control", "description": "Superusers always have full access. Grant access to other users below.", "notYetCreated": "Access can be configured after the library is created.", "selectUser": "Select a user…", "grant": "Grant", "empty": "No users have been granted access yet.", "loading": "Loading access settings...", "userSelectAria": "User to grant access", "levelSelectAria": "Access level to grant", "levels": { "viewer": "Viewer", "editor": "Editor", "owner": "Owner" }, "columns": { "user": "User", "accessLevel": "Access level" }, "errors": { "grant": "Failed to grant access", "updateLevel": "Failed to update access level", "revoke": "Failed to revoke access", "load": "Could not load library access settings." }, "peopleTitle": "People with access", "peopleCount": "{count, plural, one {# person} other {# people}}", "add": "Add", "emptyCreate": "Nobody else yet. People you add here get access as soon as the library exists.", "superusers": "Superusers always have full access.", "levelsHint": "Viewers can browse and read. Editors and owners can also edit metadata when their account has the Edit metadata permission.", "levelFor": "Access level for {name}", "revokeFor": "Remove access for {name}", "revokeQuestion": "Remove access?", "revoke": "Remove", "keep": "Keep", "failed": { "title": "{count, plural, one {# person could not be added} other {# people could not be added}}", "body": "The library was created. Try adding {names} again, or add them later from this section." } }, "optional": "Optional", "nav": { "details": "Library", "folders": "Folders", "scanner": "Scanning", "metadata": "Metadata", "reading": "Reading", "schedule": "Automation", "fileWrite": "File updates", "access": "Access", "descriptions": { "details": "What the library is called and how its covers look.", "folders": "The server folders this library reads from.", "scanner": "How files are grouped into books, and which files are skipped.", "metadata": "Which file leads when a book has several, and where its details come from.", "reading": "When a book moves from unread to reading to read.", "schedule": "Keep the library current without pressing Scan.", "fileWrite": "Optional changes BookOrbit may make to the files on disk.", "access": "Who else can see and work with this library." } }, "sheet": { "createTitle": "New library", "createHint": "Name it and point it at a folder. Everything else starts with a sensible default.", "editFallbackTitle": "Library settings", "editSubtitle": "{books, plural, one {# book} other {# books}} · {folders, plural, one {# folder} other {# folders}} · {mode}", "editSubtitleNoBooks": "{folders, plural, one {# folder} other {# folders}} · {mode}", "readyHint": "Ready to create. The rest can wait.", "needsHint": "Needs a name, an icon and a folder.", "discardQuestion": "Discard your unsaved changes?", "discard": "Discard", "keepEditing": "Keep editing", "done": "Done", "loading": "Loading settings...", "staleWarning": "The latest library settings could not be loaded. You can still edit the cached settings shown here.", "scanNow": "Scan now" }, "summary": { "needsName": "Needs a name", "needsIcon": "Needs an icon", "needsFolder": "Needs a folder", "detailsPortrait": "{name} · Portrait covers", "detailsSquare": "{name} · Square covers", "folders": "{folders, plural, one {# folder} other {# folders}}", "foldersFiles": "{folders, plural, one {# folder} other {# folders}} · {files, plural, one {# file} other {# files}}", "foldersBooks": "{folders, plural, one {# folder} other {# folders}} · {books, plural, one {# book} other {# books}}", "scannerAll": "{mode} · All formats", "scannerSome": "{mode} · {count, plural, one {# format} other {# formats}}", "metadataFile": "{format} leads · Book file first", "metadataOpf": "{format} leads · metadata.opf first", "reading": "Started {start} · Finished {finish}", "watchingScheduled": "Watching · {schedule}", "watchingOnly": "Watching · No schedule", "scheduledOnly": "Not watching · {schedule}", "manualOnly": "Manual scans only", "customSchedule": "Custom schedule", "writesAndRenames": "{count, plural, =0 {Writes nothing} one {Writes # kind} other {Writes # kinds}} · Renames", "writes": "{count, plural, =0 {Writes nothing} one {Writes # kind of file} other {Writes # kinds of file}}", "renames": "Renames files", "untouched": "Files left untouched", "onlySuperusers": "Only superusers", "accessQueued": "{count, plural, one {# person to add} other {# people to add}}", "accessPeople": "{count, plural, =0 {Only superusers} one {# person} other {# people}}" }, "errors": { "nameRequired": "Enter a library name.", "iconRequired": "Choose an icon.", "folderRequired": "Add at least one folder.", "cronInvalid": "Enter a valid 5-field cron expression.", "readingStartRange": "Reading start must be between 0.05% and 5%.", "fileSizeRange": "File-size limits must be whole numbers from 1 to 10,000 MB.", "saveFailed": "Failed to save library.", "connection": "Could not connect to the server. Check your connection and try again." }, "copyName": "{name} copy" }, "folderPicker": { "title": "Browse server folders", "description": "Select one or more folders for this library.", "closeAria": "Close folder browser", "currentFolderAria": "Current folder", "parentFolder": "Go to parent folder", "newFolder": "New folder", "goUp": "Go up", "filterPlaceholder": "Filter folders…", "clearFilterAria": "Clear folder filter", "newFolderNamePlaceholder": "New folder name", "create": "Create", "loading": "Loading folders...", "selectCurrent": "Select current folder", "noMatches": "No matching folders", "noMatchesHint": "Try a different filter.", "empty": "This folder is empty", "emptyHint": "You can select the current folder or create a new one.", "openFolderAria": "Open {name}", "selectedCount": "{count, plural, =0 {no folders selected} one {# folder selected} other {# folders selected}}", "noFolders": "No folders found", "selectFolder": "Select this folder", "errors": { "readDirectory": "Could not read directory", "connect": "Could not connect", "invalidName": "Enter a single folder name without slashes or leading dots", "createFolder": "Could not create folder" } }, "folderBrowser": { "title": "Choose folders", "subtitle": "For {name} · {mode}", "unnamedLibrary": "the new library", "close": "Close", "mode": { "folder": "Folder as Book", "file": "File as Book" }, "field": { "placeholder": "Find a folder, or paste a path", "label": "Find a folder or type a path", "clear": "Clear", "mounted": "Mounted", "libraries": "Libraries", "recent": "Recent", "thisLibrary": "{name} (this library)", "jumpHint": "Type to find a folder by name, or start with {key} to type a path", "inFolder": "In {path}", "completeHint": "{tab} complete {enter} show in tree", "noCompletion": "No folder in {path} starts with that. {key} tries the path as typed.", "pathMissing": "{path} doesn't exist on the server.", "pathMissingSuggest": "{path} doesn't exist on the server. Did you mean {suggestion}?", "pathBlocked": "BookOrbit never opens {path}: it is a system folder.", "findSummary": "{count, plural, one {# folder matches} other {# folders match}} “{query}”, shown with the folders around {count, plural, one {it} other {them}}.", "findEnter": "{key} goes to the first.", "findTruncated": "Showing the first {count} matches.", "findNone": "No folder on the server matches. Try fewer letters." }, "view": { "button": "View", "label": "View options", "sort": "Sort", "sortName": "Name", "sortBooks": "Most books first", "show": "Show", "showEmpty": "Folders without books", "showSystem": "System folders" }, "newFolder": { "button": "New folder", "label": "New folder in {name}", "placeholder": "New folder in {name}", "inputLabel": "New folder name", "hint": "{enter} create {escape} cancel", "create": "Create", "errors": { "empty": "Enter a folder name.", "invalid": "Use one folder name, without slashes or a leading dot.", "exists": "{name} already exists here.", "denied": "BookOrbit can't write here.", "failed": "The folder could not be created." } }, "tree": { "label": "Server folders", "expand": "Expand {name}", "collapse": "Collapse {name}", "select": "Select {name}", "readsThis": "{name} reads this folder", "thisLibrary": "This library", "librariesInside": "{names} {count, plural, one {reads a folder} other {read folders}} inside", "inside": "{count} inside", "appData": "BookOrbit data", "noAccess": "No access", "loading": "Loading folders", "systemHidden": "{count, plural, one {# system folder} other {# system folders}} hidden at {path}", "moreFolders": "Only the first {count} folders here are listed. Find by name or type a path to reach the rest.", "unreadable": "BookOrbit can't read {path}.", "placesFailed": "BookOrbit could not load the server's folders.", "retry": "Try again" }, "count": { "books": "{count, plural, one {# book} other {# books}}", "atLeast": "{count}+", "more": "+{count} more" }, "plan": { "label": "What this library will read", "willRead": "{name} will read", "newFolders": "{count, plural, one {# new folder} other {# new folders}}", "already": "already · {books}", "emptyTitle": "Nothing picked yet", "emptyHint": "Tick folders in the tree. A ticked folder brings everything inside it.", "rowSize": "{books} · {size}", "show": "Show {name} in the tree", "showTitle": "Show in the tree", "remove": "Remove {name}", "fit": { "folder": "Each folder holds one book.", "file": "Each file is one book.", "empty": "Empty for now." }, "attention": { "containsOne": "Contains {folder}, which {library} reads. Those books would be in two libraries.", "containsMany": "Contains folders that {libraries} read. Those books would be in two libraries.", "overlapExact": "{library} already reads this folder. Both libraries would import the same {count, plural, one {# book} other {# books}}.", "overlapInside": "This folder is inside {library}'s folder, so its books would be in both libraries.", "merge": "{count, plural, one {# folder here holds} other {# folders here hold}} several books: as Folder as Book each becomes 1 book.", "split": "{count, plural, one {# audiobook here is} other {# audiobooks here are}} in parts: as File as Book each part becomes its own book.", "locked": "Organization is fixed once a library exists.", "leaveOutOne": "Leave out {folder}", "leaveOutMany": "Leave them out", "remove": "Remove", "useFile": "Use File as Book", "useFolder": "Use Folder as Book" }, "suggestions": "Not in any library yet", "suggestionsMeta": "books no library reads", "add": "Add", "preview": { "label": "Looking at", "ticks": "{key} ticks it", "wouldAdd": "Would add {books} · {size}", "empty": "Empty for now", "merge": "Several books share a folder here: as Folder as Book each such folder is 1 book.", "split": "Audiobooks in parts: as File as Book each part is its own book." }, "totals": { "books": "{count, plural, one {book} other {books}} · {size}", "booksOnly": "{count, plural, one {book} other {books}}", "shared": "{count} also in other libraries", "organize": "Organize as", "organizeLabel": "Organization", "segmentBooks": "{count, plural, one {# book} other {# books}}", "folderTitle": "Each folder that holds books is one book", "fileTitle": "Each file is one book", "locked": "{mode}, fixed since {name} was created" } }, "reason": { "denied": "BookOrbit can't read this folder. Give the user BookOrbit runs as read access, then reopen it.", "appData": "BookOrbit keeps covers, caches and plugins here. Pick the folder that holds your books instead.", "own": "{name} is already in this library.", "ownCovered": "This library already reads {path}, which includes this folder.", "included": "Included because you selected {path}." }, "notice": { "folded": "{path} includes {count, plural, one {{name}} other {# folders you picked}}, so {count, plural, one {it was} other {they were}} folded into it.", "range": "Ticked {count, plural, one {# folder} other {# folders}}, {from} to {to}.", "removed": "Removed {name}", "leftOut": "{name} became {count, plural, one {# folder} other {# folders}} beside the other libraries", "modeFile": "Switched to File as Book; the library's Scanning setting follows", "modeFolder": "Switched to Folder as Book; the library's Scanning setting follows", "created": "Made {path} and ticked it.", "createdOnly": "Made {path}.", "undo": "Undo" }, "keys": { "space": "Space", "tab": "Tab", "escape": "Esc" }, "footer": { "hints": "{move} move {fold} fold {tick} tick {range} click for a range {find} find", "add": "Add folders", "addCount": "Add {count, plural, one {# folder} other {# folders}}", "addShort": "Add", "addShortCount": "Add {count}", "nothingPicked": "Nothing picked yet", "seePlan": "See the plan" }, "divider": { "label": "Resize the plan", "title": "Drag to resize. Double-click to reset." } }, "destination": { "loadFailed": "Could not load destination libraries. Close and reopen to try again.", "noLibraries": "No book libraries are available. Create a library or ask an administrator for access.", "noFolders": "This library has no destination folders. Add a folder in Library settings.", "unavailable": "The selected library is no longer available.", "selectFolder": "Select a folder..." }, "upload": { "library": "Library", "selectLibrary": "Select a library...", "targetFolder": "Target folder", "addMoreFiles": "Add more files", "clearAll": "Clear all", "done": "Done", "retry": "Retry", "upload": "Upload", "uploadWithCount": "Upload ({count})", "viewInLibrary": "View in Library", "fileCount": "{count, plural, =0 {no files} one {# file} other {# files}}", "booksAdded": "{count, plural, =0 {no books added} one {# book added} other {# books added}}", "uploadedFailed": "{done} uploaded, {failed} failed", "progress": "{done} of {total} uploading...", "header": { "uploading": "Uploading...", "complete": "Upload complete", "uploadTo": "Upload to {library}", "uploadBooks": "Upload Books" }, "dropzone": { "title": "Drop files here or click to browse", "hint": "{formats} - up to {size} MB each" } } }, "metadataReminders": { "title": "Missing-field reminders", "navDescription": "Choose which missing metadata fields you want to see", "personal": "Your preferences", "description": "Choose which missing fields appear in book reminders. These preferences apply across your library and do not change metadata scores.", "sheetDescription": "Choose the fields you care about without leaving this book.", "fieldsHeading": "Fields to check", "autoSave": "Changes save automatically to your account.", "saving": "Saving preferences...", "saved": "Preferences saved.", "reset": "Reset to defaults", "disabled": "No fields selected. Missing-field reminders are hidden.", "saveFailed": "Could not save your preferences. Your previous preferences have been restored.", "customize": "Customize reminders...", "missingHeading": "Missing metadata", "missingDescription": "Missing fields you have chosen to track.", "missingCount": "{count, plural, one {# missing field} other {# missing fields}}", "missingFields": "{count, plural, one {missing field} other {missing fields}}", "fields": { "publisher": { "label": "Publisher", "hint": "The publisher is filled in." }, "language": { "label": "Language", "hint": "The language is filled in." }, "publication": { "label": "Publication year", "hint": "A publication year or full date is enough." }, "pageCount": { "label": "Page count", "hint": "The page count is filled in. Audio-only books are skipped." }, "isbn": { "label": "ISBN", "hint": "Either ISBN-10 or ISBN-13 is enough." }, "genres": { "label": "Genres", "hint": "At least one genre is filled in." }, "tags": { "label": "Tags", "hint": "At least one tag is filled in." }, "description": { "label": "Description", "hint": "The description is filled in." } } }, "metadataCache": { "badge": { "cached": "Cached", "stale": "Stale", "cachedHint": "Saved result from {when}", "cachedHintUndated": "Saved result", "staleHint": "The provider was unavailable, so a saved result from {when} was used", "staleHintUndated": "The provider was unavailable, so a saved result was used" }, "notice": { "someCached": "Some results came from saved searches (oldest: {when}).", "someCachedUndated": "Some results came from saved searches.", "someStale": "Some providers were unavailable, so saved results were shown (oldest: {when}).", "someStaleUndated": "Some providers were unavailable, so saved results were shown.", "searchFresh": "Search fresh", "searchFreshHint": "Ask every provider again instead of using saved answers" }, "fallback": { "usedSaved": "{count, plural, one {{providers} was unavailable, so saved results were used.} other {{providers} were unavailable, so saved results were used.}}" }, "ignoreCache": { "label": "Ignore cached results", "hint": "Ask every provider again instead of reusing saved answers. Slower, and uses more of each provider's request allowance.", "runHint": "Applies to the run you start here. Every provider is asked again instead of reusing saved answers, which is slower." } }, "metadataScore": { "missingFields": "{count, plural, =0 {no fields missing - edit metadata} one {# field missing - edit metadata} other {# fields missing - edit metadata}}" }, "migration": { "sidebarTitle": "Booklore Import", "importTitle": "Library Import", "status": { "done": "Done", "saved": "Saved", "running": "Running", "failed": "Failed" }, "badge": { "validated": "Validated", "upToDate": "Up to date", "completed": "Completed" }, "steps": { "source": { "short": "Source Connection", "title": "Source Connection", "subtitle": "Configure the database connection to your source Booklore instance.", "genericSubtitle": "Configure the connection to your source library application." }, "mappings": { "short": "User & Path Mapping", "title": "User & Path Mapping", "subtitle": "Map source users to target users and translate file paths." }, "dryRun": { "short": "Dry Run", "title": "Dry Run", "subtitle": "Preview what will be imported before running the live migration." }, "migration": { "short": "Run Migration", "title": "Run Migration", "subtitle": "Start the live import and monitor its progress." }, "report": { "short": "Report", "title": "Migration Report", "subtitle": "Review what was imported and export a detailed report." } }, "footer": { "continueToMappings": "Continue to Mappings", "continueToDryRun": "Continue to Dry Run", "continueToMigration": "Continue to Migration", "viewReport": "View Report", "resetSetup": "Reset Setup", "stepOf": "Step {current} of {total}", "backToSetup": "Back to Setup" }, "stages": { "init": "Initializing", "sharedOverlays": "Importing metadata", "bookCovers": "Importing covers", "userState": "Importing user data" }, "source": { "testConnection": "Test Connection", "saveAndValidate": "Save & Validate", "validatedWithWarnings": "Source validated with warnings", "types": { "booklore": "Booklore", "grimmory": "Grimmory", "audiobookshelf": "Audiobookshelf", "calibreWebAutomated": "Calibre-Web Automated" }, "fields": { "type": "Source Type", "name": "Source Name", "namePlaceholder": "Library import", "host": "Host", "port": "Port", "user": "User", "password": "Password", "passwordSaved": "Saved - leave unchanged", "passwordNotSet": "No password set", "showSecret": "Show secret", "hideSecret": "Hide secret", "database": "Database", "mediaRootPath": "Media Root Path", "ssl": "Use TLS/SSL", "connectionMode": "Connection mode", "apiMode": "Live API", "backupMode": "Backup file", "baseUrl": "Audiobookshelf URL", "apiToken": "API token", "apiTokenPlaceholder": "Enter an administrator API token", "secretSaved": "Saved - leave unchanged", "allowPrivateNetwork": "Allow private network access", "allowPrivateNetworkHint": "Enable this only when Audiobookshelf is hosted on a trusted local or private network.", "backupPath": "Backup file path", "backupPathHint": "Enter an absolute server path inside the configured migration import directory.", "cwaAppDatabasePath": "Calibre-Web Automated app.db snapshot", "cwaAppDatabasePathPlaceholder": "/imports/calibre-web-automated/app.db", "cwaMetadataDatabasePath": "Calibre metadata.db snapshot", "cwaMetadataDatabasePathPlaceholder": "/imports/calibre-web-automated/metadata.db" }, "validation": { "nameRequired": "Source name is required", "databaseFieldsRequired": "Host, user, database, and source name are required", "apiFieldsRequired": "Audiobookshelf URL, API token, and source name are required", "baseUrlInvalid": "Audiobookshelf URL must be a clean HTTP or HTTPS origin without a path", "backupPathRequired": "Backup file path and source name are required", "backupPathAbsolute": "Backup file path must be an absolute path", "cwaAppDatabasePathRequired": "The Calibre-Web Automated app.db snapshot path is required", "cwaAppDatabasePathAbsolute": "The Calibre-Web Automated app.db snapshot path must be absolute", "cwaMetadataDatabasePathRequired": "The Calibre metadata.db snapshot path is required", "cwaMetadataDatabasePathAbsolute": "The Calibre metadata.db snapshot path must be absolute" }, "cwa": { "snapshotTitle": "Stopped snapshot mode", "stoppedWarning": "Stop Calibre-Web Automated before copying both databases. BookOrbit cannot verify that the two snapshots were copied at exactly the same instant.", "importRootGuidance": "Both snapshot files must be readable server paths below the configured MIGRATION_IMPORT_ROOT directory.", "logicalRootGuidance": "Book path mapping uses the logical Calibre library root stored in app.db, not the host folder containing these database snapshots.", "compatibilityNote": "Schema behavior is verified against Calibre-Web Automated v4.0.6. Its databases do not expose a reliable application release version." }, "mediaPath": { "hintRequired": "Required for migrating book covers.", "hintAbsolute": "Use an absolute path (for example: /books). Relative paths are not supported.", "hintConfigured": "Cover import path configured. Use Test Connection to verify access and Booklore images folder structure.", "buttonOk": "Path OK", "buttonIssue": "Path Issue", "buttonTest": "Test Path" }, "compatibility": { "title": "Tested compatibility", "verifiedAgainst": "Verified against:", "note": "Later versions are likely compatible but have not been verified. Run a dry-run first to confirm before committing data." }, "snapshot": { "title": "Last validation snapshot", "sourceVersion": "Source version: {version}", "unknown": "Unknown", "missingTables": "Missing required tables: {tables}" } }, "mappings": { "suggestionsAutoLoad": "User suggestions load automatically after source validation.", "refresh": "Refresh", "sourceUser": "Source User", "targetUser": "Target User", "doNotImport": "Do not import this user", "noSourceUsersLoaded": "No source users loaded yet.", "noActiveTargetUsers": "No active target users found. Create or re-enable a BookOrbit user before mapping.", "pathPrefixMappings": "Path Prefix Mappings", "addMapping": "Add Mapping", "pathMappingsExplanation": "Path mappings translate source file paths to target paths so books can be matched by file location. Books are also matched by ISBN, file hash, and title/author regardless of path mappings.", "noPrefixesFound": "No prefixes found - validate source first", "selectSourcePrefix": "Select source prefix...", "selectTargetFolder": "Select target folder...", "remove": "Remove", "saveMappings": "Save Mappings", "pathValidation": { "title": "Path validation", "mappedSummary": "{mapped} of {total} source books have a mapped path", "unmatched": "{count} mapped paths not found on disk", "allMatched": "All {count} mapped paths found on disk" } }, "dryRun": { "run": "Run Dry-Run", "matched": "Matched:", "unresolved": "Unresolved:", "duplicates": "Duplicates:", "unresolvedSummary": "Unresolved summary" }, "duplicates": { "title": "Resolve duplicate target matches", "explanation": "For each target book, choose one source book to keep. Recommended choices are preselected when there is a single strongest match.", "remainingGroups": "Remaining groups:", "ofCount": "of {total}", "targetBookId": "Target book #{id}", "recommended": "Recommended", "resolveButton": "{count, plural, =0 {Resolve # duplicate} one {Resolve # duplicate} other {Resolve # duplicates}}", "sourceRecordId": "Source record ID #{id}", "byAuthor": "by {author} (ID: {id})", "byFilePath": "{filePath} (ID: {id})", "bookloreSourceId": "Booklore source ID: {id}", "libraryBookId": "Library book #{id}" }, "preflight": { "title": "Preflight checks", "allPassed": "All checks passed - ready to migrate", "sourceValidated": "Source validated", "saveAndValidateSource": "Save and validate source connection", "validateSourceConnection": "Validate source connection", "mappingsSaved": "Mappings saved", "saveUserAndPathMappings": "Save user and path mappings", "pathMappingsValidated": "Path mappings validated", "savePathMappingsToValidate": "Save path mappings to validate them", "dryRunUpToDate": "Dry-run is up to date", "runFreshDryRun": "Run a fresh dry-run", "issues": { "saveSource": "Save source connection settings", "validateSource": "Validate source connection", "saveMappings": "Save user and path mappings", "savePathMappings": "Save path mappings to validate them", "freshDryRun": "Run a fresh dry-run", "resolveDuplicates": "Resolve duplicate target book matches in the dry-run", "waitForRun": "Wait for active run to finish" } }, "run": { "confirmPrompt": "This will start the live migration. Are you sure?", "confirmStart": "Confirm Start", "startMigration": "Start Migration", "cancelRun": "Cancel Run", "refreshStatus": "Refresh Status", "pollingStopped": "Status polling stopped due to an error.", "retry": "Retry", "stage": "Stage: {stage}", "initializing": "initializing", "ended": "Ended {time}" }, "report": { "noRunYet": "No migration run yet. Complete the steps above to start.", "runNumber": "Run #{id}", "notStarted": "Not started", "reloadReport": "Reload Report", "loadFullReport": "Load Full Report", "exportJson": "Export JSON", "exportCsv": "Export CSV", "migrationFailed": "Migration failed", "retryFromLastStage": "Retry from last completed stage", "booksSection": "Books", "metadataOverlays": "Metadata overlays applied", "authorMappings": "Author mappings replaced", "narratorMappings": "Narrator mappings replaced", "genreMappings": "Genre mappings replaced", "tagMappings": "Tag mappings replaced", "coversImported": "Covers imported", "coverImportSkipped": "Cover import skipped - media root path not configured", "couldNotMatch": "Could not match", "userDataSection": "User Data", "readingStatuses": "Reading statuses", "readingProgressEntries": "Reading progress entries", "audiobookProgressEntries": "Audiobook progress entries", "readingSessions": "Reading sessions", "bookmarks": "Bookmarks", "annotations": "Annotations", "collectionEntries": "Collection entries", "loadFullReportHint": "Click \"Load Full Report\" to include the dry-run match summary in the exported report.", "completedNoIssues": "Migration completed with no unresolved books or failures.", "matchedBooks": "Matched books ({count})", "matchedBooksExplanation": "These dry-run matches were used to decide which library books received imported data.", "sourceBook": "Source book {id}", "libraryBook": "Library book {id}", "unresolvedBooks": "Unresolved books ({count})", "unresolvedBooksExplanation": "These books exist in the source but could not be matched to any book in your library.", "mappedUsers": "Mapped users ({count})", "mappedUsersExplanation": "Per-user totals come from the dry-run preview cached with the migration plan.", "coverFailures": "{count} cover import(s) failed. Detailed failure rows are not stored.", "userPreviewCounts": "{statuses} statuses, {progress} progress entries, {sessions} reading sessions, {bookmarks} bookmarks, {annotations} annotations, {collections} collection entries" }, "unresolvedReason": { "noTitleAuthorMatch": "No matching book found by title or author", "noFilePathMatch": "File path did not match any book in this library", "noFileHashMatch": "File hash did not match any book in this library", "noIsbnMatch": "ISBN did not match any book in this library", "noAsinMatch": "ASIN did not match any book in this library", "insufficientSourceData": "Not enough metadata to attempt matching", "ambiguousIsbnMatch": "Multiple books matched the same ISBN", "ambiguousAsinMatch": "Multiple books matched the same ASIN", "ambiguousFileHashMatch": "Multiple books matched the same file hash", "ambiguousFilePathMatch": "Multiple books matched the same file path", "ambiguousTitleAuthorMatch": "Multiple books matched the same title and author", "unknown": "Could not determine reason" }, "matchStrategy": { "isbn": "Matched by ISBN", "asin": "Matched by ASIN", "fileHash": "Matched by file hash", "pathMapping": "Matched by mapped file path", "titleAuthor": "Matched by title and author", "unavailable": "Match strategy unavailable" }, "connectionError": { "unreachable": "Could not reach the database server. Check the host and port.", "authFailed": "Authentication failed. Check the username and password.", "databaseNotFound": "Database not found. Check the database name.", "timeout": "Connection timed out. Check host and firewall settings.", "generic": "Connection test failed" }, "userSelect": { "placeholder": "Select user", "noUsersFound": "No users found" }, "toast": { "initFailed": "Failed to initialize migration settings", "loadSupportedTypesFailed": "Failed to load supported migration source types", "loadTargetUsersFailed": "Failed to load target users", "loadTargetFoldersFailed": "Failed to load target library folders", "noSourceUsers": "No source users were returned", "suggestionsLoaded": "User mapping suggestions loaded", "loadSuggestionsFailed": "Failed to load user mapping suggestions", "sourceFieldsRequired": "Host, user, database, and source name are required", "connectionPassedWithWarnings": "Connection test passed with warnings", "connectionPassedWithWarningCount": "Connection test passed with {count} warning(s). First: {warning}", "connectionPassed": "Connection test passed", "connectionMissingTables": "Connection ok, but {count} required table(s) are missing", "cannotTestMediaWhileRunning": "Cannot test media path while a run is active", "mediaPathRequired": "Media Root Path is required for cover import.", "mediaPathAbsolute": "Use an absolute path (for example: /books).", "mediaPathVerified": "Media path verified.", "mediaPathValid": "Media path is valid and readable", "mediaPathValidationFailed": "Media path validation failed.", "connectionFailedBeforeMedia": "Connection test failed before media path validation could complete.", "cannotModifySourceWhileRunning": "Cannot modify source while a run is active", "sourceSavedWithWarnings": "Source saved and validated with {count} warning(s)", "sourceSaved": "Source saved and validated", "saveSourceFailed": "Failed to save or validate source", "cannotSaveMappingsWhileRunning": "Cannot save mappings while a run is active", "saveSourceFirst": "Save source first", "mapAtLeastOneUser": "Map at least one source user to a target user", "mapEveryUser": "Map every source user before saving", "pathValidationFailedButSaved": "Path validation failed, but profile will still be saved", "mappingsSaved": "Mappings saved", "saveMappingsFailed": "Failed to save mappings", "cannotDryRunWhileRunning": "Cannot run dry-run while a run is active", "saveMappingsFirst": "Save mappings first", "dryRunCompleted": "Dry-run completed: {matched} matched, {unresolved} unresolved", "dryRunFailed": "Dry-run failed", "selectSourceForDuplicates": "Select a source book for all {count} duplicate groups", "duplicatesResolved": "Duplicate matches resolved", "resolveDuplicatesFailed": "Failed to resolve duplicates", "preflightNotReady": "Migration preflight not ready", "runDryRunFirst": "Run dry-run first", "runStarted": "Migration run started", "startFailed": "Failed to start migration", "runCancelled": "Migration run cancelled", "cancelFailed": "Failed to cancel migration", "runRetried": "Migration run retried - resuming from last completed stage", "retryFailed": "Failed to retry migration", "loadProgressFailed": "Failed to load run progress", "startMigrationFirst": "Start migration first", "reportRefreshed": "Run report refreshed", "loadReportFailed": "Failed to load run report", "reportExported": "Report exported as {format}", "exportFailed": "Failed to export migration report" } }, "notifications": { "title": "Notifications", "description": "Review and manage your notifications.", "markAllRead": "Mark all read", "clear": "Clear", "empty": "No notifications yet", "loadMore": "Load more notifications", "dismiss": "Dismiss notification", "occurrences": "Happened {count} times", "occurrencesShort": "x{count}", "readAloud": { "readyTitle": "Read-aloud ready: {title}", "needsReviewTitle": "Read-aloud needs review: {title}", "needsReviewMessage": "Part of the text could not be matched to the audio. Review it before adding it to the book.", "failedTitle": "Read-aloud failed: {title}", "reviewExpiringTitle": "Read-aloud review expires soon: {title}", "reviewExpiringMessage": "The generated read-aloud will be discarded in a few days unless you review it.", "untitledBook": "Untitled book" }, "preferences": { "title": "Notifications", "subtitle": "Choose which notification categories you want to receive.", "saving": "Saving...", "unsavedChanges": "Unsaved changes", "saved": "Notification preferences saved", "saveFailed": "Failed to save preferences", "savePreferenceFailed": "Failed to save preference", "whatsNewToggle": "Show \"What's New\" after updates", "whatsNewToggleHint": "A popup highlighting new features after the app updates. The archive stays available either way.", "groups": { "library": "Library", "files": "Files", "integrations": "Integrations", "personal": "Personal", "app": "App updates" }, "enabledCount": "{enabled} of {total} enabled", "levels": { "off": { "short": "Off", "description": "Never notify me about this." }, "problems": { "short": "Problems", "description": "Only notify me when something fails or needs attention." }, "all": { "short": "All", "description": "Notify me every time, including successes." } }, "categories": { "scanning": { "label": "Library scanning", "description": "When a library scan finishes, fails, or finds missing books." }, "metadata": { "label": "Metadata fetching", "description": "When metadata lookups for your books complete or fail." }, "authorEnrichment": { "label": "Author enrichment", "description": "When author biographies and photos finish being fetched." }, "fileWriteBack": { "label": "File write-back", "description": "When edited metadata is written back into book files on disk." }, "fileRename": { "label": "File rename", "description": "When a single book file is renamed to match your naming pattern." }, "bulkRename": { "label": "Bulk rename", "description": "When a bulk rename or a move of books between libraries completes or fails." }, "readAloud": { "label": "Read-aloud generation", "description": "When a read-aloud you started is ready, needs your review, or fails." }, "migration": { "label": "Data migration", "description": "When an import from another library tool completes or fails." }, "bookDock": { "label": "Book Dock", "description": "When Book Dock finalization completes or encounters problems." }, "koboSync": { "label": "Kobo sync", "description": "When a Kobo device finishes syncing with your library." }, "email": { "label": "Email delivery", "description": "When sending a book to an email address succeeds or fails." }, "achievements": { "label": "Achievements", "description": "When you unlock a new reading achievement." }, "bookRequests": { "label": "Book requests", "description": "When a book request is submitted, decided, or the book becomes available." } } } }, "reader": { "pageImages": { "loadFailed": "Could not open this document. Check your access or try again.", "pageFailed": "This page could not be loaded. Retry when the server is available.", "pageAlt": "Page {page}", "previousPage": "Previous page", "nextPage": "Next page", "goToPage": "Go to page", "pin": "Pin reader menu", "unpin": "Unpin reader menu" }, "djvu": { "pageText": "Embedded page text", "textDescription": "Text stored in the DjVu document. OCR may contain mistakes.", "noText": "This page has no embedded text.", "textFailed": "Could not load this page's embedded text." }, "retry": "Retry", "pdf": { "openError": "Unable to open this PDF", "preparing": "Preparing PDF reader", "opening": "Opening PDF", "loading": "Loading PDF", "loadFallback": "The document could not be loaded.", "requestFailed": "The PDF request failed with status {status}.", "emptyDocument": "The PDF request returned an empty document.", "managerError": "The PDF document manager could not be initialized.", "engineNoPages": "The PDF engine opened this document without any pages.", "engineOpenError": "The PDF could not be opened by the document engine.", "noPages": "This PDF opened without any pages", "noPagesHint": "Reload the document to recover from the incomplete PDF engine response.", "externalLinkTitle": "Open external link?", "externalLinkDescription": "This PDF wants to open {host} in a new tab.", "openLink": "Open link", "annotationsLoadError": "Could not load highlights for this PDF.", "loadingAnnotations": "Loading PDF highlights", "loadMoreAnnotations": "Load more highlights", "loadingMoreAnnotations": "Loading more highlights…", "sidebar": { "pages": "Pages", "contents": "Contents", "search": "Search", "tabsLabel": "PDF navigation", "closeNavigation": "Close navigation", "goToPage": "Go to page {page}", "noOutline": "This PDF has no document outline.", "searchPlaceholder": "Search this PDF", "clearSearch": "Clear search", "matchCase": "Match case", "wholeWord": "Whole word", "resultPosition": "{current} of {total}", "previousResult": "Previous result", "nextResult": "Next result", "searchingPage": "Searching page {page} of {total}", "searchPrompt": "Type a term to search this PDF.", "searchTooShort": "Enter at least {min} characters to search this PDF.", "noSearchResults": "No searchable text matched your query.", "page": "Page {page}", "filterOutline": "Filter outline", "noOutlineMatch": "No outline entries match your filter.", "loadingOutline": "Loading outline", "expandSection": "Expand {title}", "collapseSection": "Collapse {title}", "jumpToPage": "Jump to page", "resizePanel": "Resize navigation panel" }, "toolbar": { "navigation": "Document navigation", "previousPage": "Previous page", "currentPage": "Current page", "nextPage": "Next page", "zoomOut": "Zoom out", "zoomIn": "Zoom in", "panTool": "Pan tool", "pan": "Pan", "selectTool": "Select text tool", "selectText": "Select text", "pinHeader": "Pin reader header", "unpinHeader": "Unpin reader header", "pinHeaderShort": "Pin header", "unpinHeaderShort": "Unpin header", "moreTools": "More PDF tools", "settings": "PDF settings" } }, "loadingBook": "Loading book…", "failedToLoadBook": "Failed to load book", "bookLoadTimeout": "The book took too long to open. Try refreshing the page.", "chapterNumber": "Chapter {number}", "peek": { "badge": "Peeking", "startReading": "Start reading" }, "toast": { "linkedHighlightError": "Could not open the linked highlight position", "resumed": "Resumed at {pct}% - {label}", "newerPositionError": "Could not open your newer place", "highlightSaveFailed": "Could not save the highlight", "noteSaveFailed": "Could not save the note", "highlightDeleteFailed": "Could not delete the highlight", "bookmarkSaveFailed": "Could not add the bookmark", "bookmarkDeleteFailed": "Could not remove the bookmark", "bookmarkUpdateFailed": "Could not save the bookmark", "marksLoadFailed": "Could not load your highlights and bookmarks" }, "newerPositionDialog": { "title": "Continue from another device?", "description": "This book was read to {remote} on another device while it was open here at {local}.", "follow": "Go to {pct}", "stay": "Stay at {pct}" }, "header": { "goBack": "Go back", "tableOfContents": "Table of contents", "toggleBookmark": "Toggle bookmark", "cycleFooterMode": "Cycle footer info mode", "keyboardShortcutsHint": "Keyboard shortcuts (?)", "enterFullscreen": "Enter fullscreen", "exitFullscreen": "Exit fullscreen", "narrationPlaying": "Narration playing", "ttsPlaying": "TTS playing", "listenWithNarrationShort": "Listen (narration)", "listen": "Listen", "listenWithNarration": "Listen with narration", "listenWithTts": "Listen with TTS", "footerMode": { "pageProgress": "Footer info: page + progress", "sessionTimeLeft": "Footer info: reading session + time left", "chapterTimeLeft": "Footer info: chapter + chapter time left" } }, "footer": { "previousSection": "Previous section", "nextSection": "Next section", "goToPlaceholder": "45 or p123", "jumpToLocation": "Jump to location", "jumpTooltip": "Jump to % or page (e.g. 45 or p123)", "go": "Go" }, "settings": { "title": "Settings", "ariaLabel": "Reader settings", "close": "Close settings", "reset": "Reset to defaults", "modeLabel": "Color mode", "mode": { "light": "Light", "dark": "Dark" }, "textSize": "Text size", "textSizeSmaller": "Smaller text", "textSizeLarger": "Larger text", "pixels": "{value} px", "percent": "{value}%", "pageColor": "Page color", "font": "Font", "fontBuiltIn": "Built-in", "fontServer": "Server fonts", "fontYours": "Your fonts", "fontStyle": "Style", "fontStyleItalicOf": "{style} Italic", "lineSpacing": "Line spacing", "paragraphSpacing": "Paragraph spacing", "paragraphSpacingDefault": "Default", "paragraphSpacingValue": "{value} em", "letterSpacing": "Letter spacing", "wordSpacing": "Word spacing", "textIndent": "First-line indent", "bookDefault": "Book", "custom": "Custom", "emValue": "{value} em", "pageWidth": "Page width", "pageWidthNarrow": "Narrow", "pageWidthMedium": "Medium", "pageWidthWide": "Wide", "pageWidthFull": "Full", "readingFlow": "Reading flow", "flow": { "paginated": "Pages", "scrolled": "Scroll" }, "pageSpreads": "Page spreads", "pageSpreadsHint": "Choose how this image-based EPUB pairs pages.", "spread": { "bookDefault": "Book default", "singlePage": "Single page" }, "advanced": "Advanced layout", "columns": "Columns", "columnsFewer": "Fewer columns", "columnsMore": "More columns", "columnGap": "Column gap", "justifyText": "Justify text", "hyphenation": "Hyphenation", "themes": { "default": "Default", "gray": "Gray", "sepia": "Sepia", "crimson": "Crimson", "meadow": "Meadow", "rosewood": "Rosewood", "azure": "Azure", "dawnlight": "Dawnlight", "ember": "Ember", "aurora": "Aurora", "ocean": "Ocean", "mist": "Mist", "amoled": "AMOLED" }, "fonts": { "bookDefault": "Book default", "serif": "Serif", "sansSerif": "Sans-serif", "monospace": "Monospace" } }, "search": { "placeholder": "Search in book (min {min} chars)...", "searching": "Searching…", "tooShort": "Type at least {min} characters", "noResults": "No results found", "prompt": "Type to search", "resultCount": "{count, plural, =0 {no results} one {# result} other {# results}}" }, "sidebar": { "tabs": { "chapters": "Chapters", "bookmarks": "Bookmarks", "highlights": "Highlights", "toc": "Table of contents", "tocShort": "TOC", "marksShort": "Marks", "notesShort": "Notes" }, "pin": "Pin sidebar", "unpin": "Unpin sidebar", "close": "Close sidebar", "noChapters": "No chapters found", "noBookmarks": "No bookmarks yet", "noBookmarksMatch": "No bookmarks match your filters", "noHighlights": "No highlights yet", "noHighlightsMatch": "No highlights match your filters", "searchBookmarks": "Search bookmarks...", "searchHighlights": "Search highlights...", "bookmarkFallback": "Bookmark", "locationUnavailable": "Location unavailable", "customColor": "Custom ({color})", "allColors": "All colors", "allChapters": "All chapters", "notesOnly": "Notes only", "deleteBookmark": "Delete bookmark", "editBookmark": "Edit bookmark", "deleteHighlight": "Delete highlight", "approximatePosition": "Synced from device; exact position unavailable, jumps to the chapter", "sort": { "readingOrder": "Reading order", "newest": "Newest first", "oldest": "Oldest first" } }, "selection": { "copy": "Copy", "copied": "Copied!", "highlight": "Highlight", "translate": "Translate", "define": "Define", "deleteAnnotation": "Delete annotation", "readFromHere": "Read from here", "apply": "Apply", "color": "Highlight color: {color}", "style": "Highlight style: {style}", "styles": { "highlight": "Highlight", "underline": "Underline", "strikethrough": "Strikethrough", "squiggly": "Squiggly underline" } }, "note": { "title": "Add note", "placeholder": "Write your note…" }, "dictionary": { "noDefinition": "No definition found", "loadError": "Could not load definition" }, "translation": { "original": "Original", "translation": "Translation", "translating": "Translating...", "noTranslation": "No translation yet", "viaProvider": "via {provider}", "copyTranslation": "Copy translation" }, "shortcuts": { "title": "Keyboard Shortcuts", "groups": { "panels": "Panels", "reading": "Reading", "actions": "Actions" }, "toggleToc": "Toggle table of contents", "toggleSearch": "Toggle search", "toggleHelp": "Show/hide this help", "closePanel": "Close panel", "prevNextPage": "Previous/next page", "goToStart": "Go to start of book", "goToEnd": "Go to end of book", "toggleBookmark": "Toggle bookmark", "toggleFullscreen": "Toggle fullscreen", "cycleFooterMode": "Cycle footer info mode" }, "cbz": { "fitMode": "Fit mode", "background": "Background", "scrollMode": "Scroll mode", "scrollModeHint": "Use \"No gaps\" for webtoons and vertical strips.", "readingDirection": "Reading direction", "autoAdvance": "Auto-advance", "autoAdvanceHint": "Turning past the last page opens the next book in the series.", "autoAdvancePagedOnly": "Auto-advance applies in paged mode only.", "pageView": "Page view", "twoPagePagedOnly": "Two pages are shown only in paged mode.", "spreadSection": "Two-page spread", "spreadFallbackHint": "This screen is too narrow for two pages, so single pages are shown.", "spreadAlignmentLabel": "Spread alignment", "spreadGap": "Spread gap", "spreadGapValue": "{value}px", "forceTwoPage": "Force two-page", "widePages": "Wide pages", "firstPage": "First page", "lastPage": "Last page", "zoomControls": "Zoom controls", "zoomOut": "Zoom out", "zoomIn": "Zoom in", "fit": { "page": "Page Fit", "width": "Page Width", "height": "Page Height", "actual": "Actual Size" }, "view": { "single": "Single", "twoPage": "Two-page" }, "scroll": { "paged": "Paged", "infinite": "Infinite", "noGaps": "No gaps" }, "direction": { "ltr": "L to R", "rtl": "R to L" }, "spreadAlignment": { "normal": "Normal", "shifted": "Shifted" }, "widePage": { "auto": "Auto", "inSpreads": "In spreads" }, "bg": { "black": "Black", "gray": "Gray", "white": "White" }, "nextIssue": { "eyebrow": "Next in series", "action": "Read next", "open": "Read next: {title}", "numbered": "#{index} {title}", "untitled": "Untitled", "autoAdvanceHint": "Turn the page again to continue" } }, "audiobook": { "untitled": "Untitled", "loading": "Loading audiobook...", "loadError": "Failed to load audiobook", "noAudioFiles": "No audio files found for this book.", "speed": "Speed", "chapters": "Chapters", "bookmarks": "Bookmarks", "volume": "Volume", "muted": "Muted", "sleep": "Sleep", "chapterAbbrev": "Ch.", "sleepTimer": "Sleep timer", "minutes": "{count, plural, one {# minute} other {# minutes}}", "endOfChapter": "End of chapter", "noChaptersAvailable": "No chapters available", "extend15": "+ 15 minutes", "timeLeft": "({time} left)", "playbackSpeed": "Playback speed", "noChapters": "No chapters available.", "noBookmarks": "No bookmarks yet.", "noBookmarksHint": "Tap the bookmark icon at the top to save your current position.", "playerSettings": "Player settings", "skipBack": "Skip back", "skipForward": "Skip forward" }, "sheet": { "expand": "Expand panel", "collapse": "Collapse panel" }, "narration": { "fallbackTitle": "Narration", "meta": "Audio narration - {speed}x", "openControls": "Open narration controls", "previousSentence": "Previous sentence", "nextSentence": "Next sentence", "play": "Play narration", "pause": "Pause narration", "showControls": "Show controls", "hideControls": "Hide controls", "stop": "Stop narration", "error": "Narration playback error" }, "bookmarkEdit": { "title": "Edit bookmark", "titleLabel": "Title", "noteLabel": "Note", "notePlaceholder": "Optional note" } }, "readingHistory": { "title": "History", "listLabel": "Finished reads, {period}", "error": "Your reading history could not load.", "retry": "Try again", "actions": { "share": "Share image", "export": "Export" }, "period": { "year": "Year", "allTime": "All time", "newerYears": "Show newer years", "olderYears": "Show older years", "quarterGroup": "Quarter", "quarter": "Q{quarter}", "quarterYear": "Q{quarter} {year}" }, "toolbar": { "search": "Search books", "searchLabel": "Search titles and authors", "clearSearch": "Clear search", "outcomes": "Outcome", "outcome": { "completed": "Finished", "skimmed": "Skimmed", "abandoned": "Abandoned" }, "order": "Order", "newest": "Newest first", "oldest": "Oldest first", "view": "View", "list": "List", "covers": "Covers", "listView": "List view", "coversView": "Covers view", "oneBook": "One book", "clearBook": "Show every book, not only {title}" }, "month": { "undated": "No finish date", "reads": "{count, plural, one {# read} other {# reads}}", "rereads": "{count, plural, one {# reread} other {# rereads}}", "hours": "{hours}h" }, "duration": { "underMinute": "<1m", "minutes": "{minutes}m", "hoursMinutes": "{hours}h {minutes}m" }, "row": { "untitled": "Untitled", "noDate": "No date", "readNumber": "{n, selectordinal, one {#st read} two {#nd read} few {#rd read} other {#th read}}", "readNumberTitle": "{count, plural, one {Finished once in all} other {Finished # times in all}}", "abandoned": "Abandoned", "abandonedAt": "Abandoned at {percent}", "skimmed": "Skimmed", "removed": "Removed from library", "removedShort": "Removed", "removedTitle": "Deleted from the library on {date}. This read stays in your history.", "sameDay": "Same day", "startedSpan": "Started {date} · {count, plural, one {# day} other {# days}}", "finishOnly": "Finish date only", "noDates": "No dates recorded", "sessions": "{count, plural, one {# session} other {# sessions}}", "sessionsTime": "{sessions} · {time}", "sourcesMore": "{names} +{count}", "highlights": "{count, plural, one {# highlight} other {# highlights}}", "journal": "{count, plural, one {# journal entry} other {# journal entries}}", "notesAndRating": "Notes and rating" }, "tile": { "label": "{title}, finished {date}", "readNumber": "{n, selectordinal, one {#st} two {#nd} few {#rd} other {#th}}" }, "notes": { "loading": "Loading notes from this read", "failed": "The notes from this read could not load.", "note": "Note", "journal": "Journal", "thisRead": "This read", "allHighlights": "{count, plural, one {The highlight from this read} other {All # highlights from this read}}", "readingLog": "Reading log" }, "rating": { "group": "Rate this read", "rate": "{count, plural, one {Rate # star} other {Rate # stars}}", "clear": "Clear this read's rating", "ofFive": "{rating} of 5 stars", "notRated": "Not rated", "failed": "The rating could not be saved." }, "panel": { "label": "Read of {title}", "close": "Close", "firstRead": "First read", "readOf": "{n, selectordinal, one {#st} two {#nd} few {#rd} other {#th}} read of {count}", "finished": "Finished", "started": "Started", "took": "Took", "timeRead": "Time read", "timeReadValue": "{time} over {count, plural, one {# session} other {# sessions}}", "where": "Where", "notRecorded": "Not recorded" }, "rail": { "label": "{period} in numbers", "inNumbers": "{period} in numbers", "totals": "Totals", "reads": "Reads", "books": "Books", "rereads": "Rereads", "pagesLabel": "Pages", "pages": "{count, plural, one {# page} other {# pages}}", "hours": "{hours}h", "daysRead": "{count, plural, one {# day read} other {# days read}}", "rated": "{count, plural, one {# rated} other {# rated}}", "averageRating": "{rating}★", "notCounted": "Plus {count} skimmed or abandoned, not counted.", "byMonth": "By month", "best": "Best: {month} · {count}", "monthBar": "{month}: {count, plural, one {# read} other {# reads}}", "firstReads": "First reads", "quarters": "Quarters", "goal": "Reading goal {year}", "goalProgress": "{reached} of {target} books.", "goalMet": "Met on {date}.", "goalRereads": "Rereads count toward it.", "records": "Records", "fastest": "Fastest", "pagesPerDay": "{count, plural, one {# page a day} other {# pages a day}}", "longestBook": "Longest book", "mostReread": "Most reread", "times": "{count, plural, one {# time} other {# times}}", "longestRead": "Longest read", "days": "{count, plural, one {# day} other {# days}}", "formats": "Formats", "whereYouRead": "Where you read", "undated": "{count, plural, one {# finished read has no date} other {# finished reads have no date}}", "showUndated": "Show them in All time" }, "empty": { "title": "No finished reads yet", "body": "Books land here as you finish them, in any reader or app. Mark a book read and it shows up too.", "filteredTitle": "No reads match", "filteredBody": "Try another period, turn on another outcome, or clear the search." }, "export": { "title": "Export {period}", "description": "{count, plural, one {# read} other {# reads}}, as the list shows them now.", "close": "Close", "format": "Format", "formats": { "md": { "name": "Markdown", "hint": "For notes apps like Obsidian. One line per read, grouped by month." }, "csv": { "name": "CSV", "hint": "For spreadsheets. One row per read with dates, pages, time and rating." }, "json": { "name": "JSON", "hint": "Every field, for scripts and backups." } }, "includes": "Includes", "includesOthers": "Finished reads, plus the skimmed and abandoned ones the list shows.", "finishedOnly": "Finished reads only. Turn on Skimmed or Abandoned in the list to add them.", "preview": "Preview of {file}", "previewFailed": "The preview could not load. The download still works.", "moreLines": "{count, plural, one {# more line} other {# more lines}}", "download": "Download", "preparing": "Preparing {done} of {total}", "saved": "{count, plural, one {Exported # read} other {Exported # reads}}", "failed": "The export could not be prepared.", "fileHeading": "Reading history, {period}" }, "share": { "title": "Share image", "description": "A picture of your reading to post or send. Nothing leaves BookOrbit until you save or copy it.", "close": "Close", "loading": "Gathering your covers", "loadFailed": "The image could not be made. Close this and try again.", "period": "Period", "periods": { "quarter": "Quarter", "month": "Month" }, "periodSummary": "{period} · {count, plural, one {# read} other {# reads}}", "monthYear": "{month} {year}", "shape": "Shape", "shapes": { "square": { "name": "Square", "hint": "1080 × 1080, for posts" }, "story": { "name": "Story", "hint": "1080 × 1920, for stories" }, "wide": { "name": "Wide", "hint": "1600 × 900, for chats and blogs" } }, "look": "Look", "looks": { "dark": "Dark", "light": "Light" }, "show": "Show", "titles": "Titles on covers", "rereads": "Reread counts", "rereadsHint": "A book read three times shows once, marked ×3.", "ratings": "Your ratings", "fileHint": "{shape} · PNG · {width} × {height}", "copy": "Copy image", "save": "Save PNG", "copied": "Image copied", "copyFailed": "The image could not be copied. Save it instead.", "saved": "Image saved", "saveFailed": "The image could not be saved.", "previewLabel": "Share image of {period}: {count, plural, one {# read} other {# reads}}", "poster": { "eyebrowYear": "{name}'s year in reading", "eyebrowPeriod": "{name}'s {period} in reading", "reads": "{count, plural, one {read} other {reads}}", "books": "{count, plural, one {book} other {books}}", "hours": "{count, plural, one {hour} other {hours}}", "pages": "{count, plural, one {page} other {pages}}", "busiestMonth": "Busiest month", "more": "+{count}" } }, "links": { "goalReads": "See {count, plural, one {the # read} other {all # reads}}", "bookReads": "See every read in History", "chartHint": "Select a month to see its reads in History" } }, "scanner": { "filesProgress": "{processed}/{total} files", "booksFound": "{count, plural, =0 {no books found} one {# book found} other {# books found}}" }, "series": { "completion": { "readOfTotal": "{read} of {total} read ({percentage}%)" }, "ownership": { "label": "In library", "ownedOfExpected": "{owned} of {expected} in library" }, "gaps": { "label": "Possible gaps:", "missingCount": "{count, plural, one {# missing} other {# missing}}", "missingList": "Missing {list}", "previewMore": "{shown} +{count}" }, "filters": { "title": "Series Filters", "clearAll": "Clear all", "allLibraries": "All Libraries", "allCompletion": "All completion", "notStarted": "Not started", "inProgress": "In progress", "complete": "Complete" }, "list": { "title": "Series", "showControlsAria": "Show series controls", "searchPlaceholder": "Search series or author", "sortButton": "Sort", "sortBy": "Sort by", "ascending": "Ascending", "descending": "Descending", "ascShort": "Asc", "descShort": "Desc", "filters": "Filters", "clear": "Clear", "noMatch": "No series match your filters.", "empty": "No series found in your libraries.", "sort": { "name": "Name", "bookCount": "Book Count", "recentAdditions": "Recent Additions", "readingProgress": "Reading Progress" }, "clearSearch": "Clear search", "noMatchHint": "Try another library, or clear what is set.", "emptyHint": "Series appear once your books carry series metadata." }, "detail": { "pageTitle": "Series", "pageTitleNamed": "Series · {name}", "pageTitleWithId": "Series #{id}", "entityName": "Series", "bookCount": "{count, plural, =0 {no books} one {# book} other {# books}}", "byAuthors": "by {authors}", "moreAuthors": "+{count} more", "preparingEditor": "Preparing editor...", "editMetadata": "Edit Metadata", "firstInSeries": "First in Series", "untitled": "Untitled", "loadingFirstBook": "Loading first book preview...", "showLess": "Show less", "showMore": "Show more", "moreGenres": "+{count} more", "synopsis": "Synopsis", "noDescription": "No description available.", "updatingPreview": "Updating preview...", "noBooksToPreview": "No books available to preview.", "loadingSeries": "Loading series...", "booksHeading": "Books", "allLibraries": "All Libraries", "groupByMedia": "Group by media", "noBooksFound": "No books found in this series", "trySelectingLibrary": "Try selecting another library.", "allBooksLoaded": "All {count} books loaded", "leadBookLoadError": "Failed to load lead book details", "noBooksToEdit": "This series has no books to edit.", "loadFullSeriesError": "Failed to load the full series for editing.", "sort": { "seriesOrder": "Series Order", "title": "Title", "recentlyAdded": "Recently Added" }, "order": { "ascending": "Ascending", "descending": "Descending" } }, "authorsPlus": "{authors} +{count}", "track": { "readCount": "{count, plural, one {# read} other {# read}}", "readingCount": "{count, plural, one {# in progress} other {# in progress}}", "unreadCount": "{count, plural, one {# unread} other {# unread}}", "missingCount": "{count, plural, one {# missing} other {# missing}}", "slotMissing": "{number} not in library", "untitled": "Untitled" }, "legend": { "read": "Read", "reading": "Reading", "unread": "In library", "missing": "Missing" }, "status": { "label": "Filter series by reading status", "all": "All", "reading": "Reading", "unread": "Unread", "complete": "Complete", "gaps": "Gaps", "read": "Read", "inProgress": "In progress", "hasGaps": "Has gaps", "notStarted": "Not started" }, "index": { "columnSeries": "Series", "columnVolumes": "Volumes", "columnRead": "Read", "columnNext": "Up next", "columnAdded": "Added", "percent": "{value}%", "captionReading": "{base} · {count, plural, one {# in progress} other {# in progress}}", "finished": "Read end to end", "reading": "Reading", "next": "Next", "start": "Start" }, "grouping": { "label": "Group by", "none": "No grouping", "letter": "By letter", "library": "By library", "status": "By status" }, "libraries": { "more": "+{count}" }, "card": { "oneVolume": "One volume", "oneVolumeShort": "1 vol", "volumeCount": "{count, plural, one {# volume} other {# volumes}}", "readSummary": "{base} · {read} read", "publishedOf": "{owned} of {total} published", "complete": "Complete", "moreVolumes": "{count, plural, one {# more volume} other {# more volumes}}", "label": "{name}, {read} of {total} volumes read" } }, "smartScope": { "syncToKobo": "Sync to Kobo", "syncToKoboHint": "Books matching this scope will appear on your Kobo device", "visibleToAll": "Visible to all users", "visibleToAllHint": "Every user can see and use this smart scope", "dialog": { "name": "Name", "namePlaceholder": "e.g. Unread Sci-Fi", "icon": "Icon", "iconPlaceholder": "Choose an icon...", "nameRequired": "Name is required", "iconRequired": "Choose an icon", "create": "Create", "creating": "Creating...", "saving": "Saving..." }, "createDialog": { "title": "New Smart Scope", "createFailed": "Failed to create Smart Scope" }, "saveAsDialog": { "title": "Save as SmartScope", "save": "Save SmartScope", "saveFailed": "Failed to save Smart Scope" }, "editorPanel": { "untitled": "Untitled SmartScope", "subtitle": "Configure smart scope settings", "counting": "counting...", "bookCount": "{count, plural, =0 {no books} one {one book} other {# books}}", "identity": "Identity", "filters": "Filters", "noFilters": "No filters set. All accessible books will be included in this smart scope.", "buildFromScratch": "Build from scratch", "replaceWithTemplate": "Replace with template:", "defaultSort": "Default Sort", "saveChanges": "Save changes", "saveFailed": "Failed to save", "templates": { "hasSeries": "Has Series", "addedRecently": "Added Recently", "pdfOnly": "PDF Only", "noGenres": "No Genres", "epubOnly": "EPUB Only" } }, "errors": { "load": "Failed to load your smart scopes", "save": "Failed to save the smart scope", "delete": "Failed to delete the smart scope", "reorder": "Failed to reorder smart scopes", "koboSync": "Failed to update Kobo sync for this smart scope" } }, "statistics": { "tabs": { "library": "Library Stats", "user": "My Reading" }, "filter": { "allLibraries": "All Libraries", "librarySelection": "{count} of {total} Libraries" }, "config": { "button": "Configure", "title": "Configure Charts", "description": "Drag to reorder, toggle to show or hide.", "reset": "Reset to defaults" }, "summary": { "books": "Books", "authors": "Authors", "series": "Series", "publishers": "Publishers", "storage": "Storage", "genres": "Genres", "languages": "Languages", "published": "Published", "thisYear": "This Year", "started": "Started", "inProgress": "In Progress", "completed": "Completed", "avgProgress": "Avg Progress" }, "card": { "loadError": "Failed to load data", "emptyTitle": "No data yet", "emptyDescription": "No data available for this chart", "unknownField": "{count, plural, =0 {no data for this field} one {# book has no data for this field} other {# books have no data for this field}}" }, "breakdown": { "ariaLabel": "Break down by source or format" }, "empty": { "notEnoughData": "Not enough data yet" }, "charts": { "acquisitionLag": { "title": "Acquisition Lag" }, "booksAddedOverTime": { "title": "Books Added Over Time", "monthly": "Monthly", "yearly": "Yearly", "allTime": "All Time", "last5Years": "Last 5 Years", "lastYear": "Last Year" }, "formatDistribution": { "title": "Format Distribution" }, "formatShareOverTime": { "title": "Format Share Over Time" }, "genreCooccurrence": { "title": "Genre Co-occurrence" }, "genreDistribution": { "title": "Genre Distribution" }, "languageDistribution": { "title": "Language Distribution" }, "largestBooks": { "title": "Top 50 Largest Books" }, "libraryIntegrity": { "title": "Library Integrity" }, "libraryMetadataCompleteness": { "title": "Library Metadata Completeness" }, "metadataCompleteness": { "title": "Metadata Completeness" }, "metadataFreshness": { "title": "Metadata Freshness" }, "metadataScoreDistribution": { "title": "Metadata Score Distribution" }, "pageCountDistribution": { "title": "Page Count Distribution" }, "publicationDecade": { "title": "Publication Decade" }, "publicationYearTimeline": { "title": "Publication Year Timeline" }, "storageByFormat": { "title": "Storage by Format" }, "topAuthors": { "title": "Top 25 Authors" }, "topSeries": { "title": "Top 50 Series" }, "booksCompleted": { "title": "Books Completed", "notEnoughData": "Need at least {count} completed books for this chart." }, "completionLatency": { "title": "Completion Latency", "notEnoughData": "Need at least {count} completed books for this chart." }, "completionTimeline": { "title": "Completion Timeline", "notEnoughData": "Need at least {count} completed books for this chart." }, "favoriteReadingDays": { "title": "Favorite Reading Days", "notEnoughData": "Need at least {count} reading events for this chart." }, "genreReadingTime": { "title": "Genre Reading Time", "notEnoughData": "Need at least {count} genres with reading time for this chart." }, "goalTrajectory": { "title": "Pace vs Goal", "noCompletedTitle": "No completed books yet", "noCompletedDescription": "Complete a book in this period to compare your pace against your yearly goal.", "notEnoughData": "Need at least {count} completed books for this chart." }, "peakReadingHours": { "title": "Peak Reading Hours", "notEnoughData": "Need at least {count} reading events for this chart." }, "progressFunnel": { "title": "Progress Funnel", "modePercent": "Percent", "modeCounts": "Counts", "modeDropoff": "Drop-off", "started": "Started {count}", "notEnoughData": "Need at least {count} started books for this chart.", "noDropOffTitle": "No drop-off observed", "noDropOffDescription": "Every started book progressed through all funnel stages in this period." }, "readingClock": { "title": "Reading Clock", "notEnoughData": "Need at least {count} reading sessions for this chart." }, "readingHeatmap": { "title": "Reading Heatmap", "notEnoughData": "Need activity on at least {count} days for this chart." }, "readingPace": { "title": "Reading Pace", "notEnoughData": "Need at least {count} sessions with progress data for this chart." }, "readingSessionTimeline": { "title": "Reading Session Timeline", "dragOn": "Drag: On", "dragOff": "Drag: Off", "prev": "Prev", "next": "Next", "week": "Week {week}", "dragHint": "Drag bars to move sessions. Duration is locked and overlapping sessions are rejected.", "noSessionsTitle": "No sessions this week", "noSessionsDescription": "Use Prev/Next or the week selector to view a different week.", "overlapError": "Session overlaps another session in this window", "moveError": "Failed to move session" }, "sessionArchetypes": { "title": "Session Archetypes" }, "sourceDistribution": { "title": "Where You Read", "emptyTitle": "No reading activity yet", "emptyDescription": "Read on the web, KOReader, or Kobo to see your source split.", "emptyDescriptionWithAppleClients": "Read on the web, iOS app, Apple Watch, KOReader, or Kobo to see your source split.", "emptyDescriptionWithNativeClients": "Read on the web, iOS app, Android app, Apple Watch, KOReader, or Kobo to see your source split." } } }, "tools": { "header": { "entityManager": "Entity Manager", "bulkRename": "Bulk Rename", "duplicateBooks": "Duplicate Books", "missingResources": "Missing Resources", "chapterHealth": "Chapter Health" }, "entityTypes": { "authors": "Authors", "genres": "Genres", "tags": "Tags", "narrators": "Narrators", "publishers": "Publishers", "languages": "Languages", "series": "Series" }, "bulkRename": { "library": "Library", "selectLibraryPlaceholder": "Select a library...", "noEligibleLibraries": "No libraries have file rename enabled. Enable it in Library Settings.", "refresh": "Refresh", "previewFailed": "Failed to load preview", "executionFailed": "Bulk rename failed", "openBookDetails": "Open book details", "openBook": "Open book", "toRenameCount": "{count, plural, =0 {nothing to rename} one {# to rename} other {# to rename}}", "applyCount": "{count, plural, one {Apply # rename} other {Apply # renames}}", "search": { "placeholder": "Find a book or path", "label": "Find a book", "clear": "Clear search" }, "filter": { "all": "All", "changes": "Changes", "conflicts": "Conflicts", "unchanged": "Unchanged" }, "status": { "willRename": "Will rename", "unchanged": "Unchanged", "collision": "Conflict", "noPattern": "No pattern", "error": "Error" }, "group": { "collision": "Destination conflict", "unchanged": "Already correct", "noPattern": "No naming pattern", "error": "Errored", "includeAll": "Include every {kind} rename", "expand": "Expand {kind}", "collapse": "Collapse {kind}", "heldBack": "These cannot be renamed" }, "changeKind": { "ungroup": "Series grouping removed", "flatten": "Duplicate folder level removed", "yearRemoved": "Publication year removed", "yearAdded": "Publication year added", "yearCorrected": "Publication year corrected", "authorSpelling": "Author name spelling", "capitalisation": "Capitalisation and spacing", "unsafeCharacters": "Unsafe characters replaced", "filenameRebuilt": "Filename rebuilt from metadata", "folderRenamed": "Folder renamed", "rebuilt": "Folder and filename rebuilt", "restructured": "Path restructured", "multiple": "Multiple changes" }, "select": { "ofSelected": "of {total} selected", "toggleAll": "Select or clear every rename", "toggleGroup": "Select or clear every {kind} rename", "toggleBook": "Rename {title}" }, "review": { "loadMore": "Load more", "queue": "Pending renames", "position": "{index} of {total}", "previous": "Previous book", "next": "Next book", "keyboardHint": "move", "keyboardSkip": "skip", "skip": "Skip", "include": "Include", "excluded": "Excluded", "back": "Back to the list" }, "detail": { "whatChanges": "What changes", "foldedFolders": "{count, plural, one {# unchanged folder} other {# unchanged folders}}", "onDisk": "On disk", "today": "Today", "afterRename": "After rename", "showLibraryFolders": "Show library folders", "hideLibraryFolders": "Hide library folders", "currentPath": "Current path", "whyItMoves": "Why it moves", "levelTop": "Top folder", "levelFolder": "Folder {depth}", "levelFilename": "Filename", "levelRemoved": "Removed", "tokenCount": "{count, plural, one {# token} other {# tokens}}", "optionalLevel": "An optional folder level, produced by a group in the pattern.", "removedExplainer": "The naming pattern has no folder at this level, so {folder} is dropped and its contents move up.", "conflictTitle": "Another file already claims this destination.", "conflictBody": "Renaming would overwrite it, so this book is held back until the conflict is resolved.", "siblings": "{count, plural, one {# more with the same change} other {# more with the same change}}", "siblingsMore": "+{count} more" }, "empty": { "title": "Pick a library to start", "description": "Select a library to preview rename changes, review them one at a time, and apply the run.", "chooseLibrary": "Choose library", "noneTitle": "Nothing to review", "noneDescription": "No book matches the current filter. Clear the search or switch to All.", "noMatch": "No books match your search." }, "confirmDialog": { "title": "{count, plural, one {Rename # file on disk?} other {Rename # files on disk?}}", "body": "This moves real files inside {library}. BookOrbit records each move, but undoing means renaming back.", "willRename": "Will be renamed", "skippedByYou": "Skipped by you", "heldBack": "Held back as conflicts", "untouched": "Left untouched", "confirm": "{count, plural, one {Rename # file} other {Rename # files}}", "cannotRename": "Cannot be renamed" }, "run": { "preparing": "Preparing…", "preparingHint": "Checking every file against the naming pattern before anything moves.", "title": "Renaming {done} of {total}", "runningHint": "Files are being renamed. You can stop after the current file finishes.", "stop": "Stop after this file", "resultTitle": "{done, plural, one {Renamed # of {total} files} other {Renamed # of {total} files}}", "resultFailed": "{count, plural, one {# failed} other {# failed}}", "resultSkipped": "{count, plural, one {# skipped} other {# skipped}}", "dismiss": "Dismiss" }, "executionError": { "http": "The server rejected the request (HTTP {status}).", "noBody": "The server did not send a response body.", "incomplete": "The connection ended before the rename finished. Some files may not have been renamed.", "unknown": "The rename could not be completed." } }, "bookDuplicates": { "title": "Duplicate Books", "scope": "Library scope", "allLibraries": "All accessible libraries", "similarity": "Similar titles", "explainSimilarity": "Explain the similar-title threshold", "similarityHelp": "Only for Similar title and author matches. At least one author and the book type must also match. Lower finds more possible duplicates; higher requires closer titles. Identical files, ISBN, and exact metadata are checked separately.", "runScan": "Run scan", "rescan": "Rescan", "status": { "queued": "Scan queued", "running": "Scanning books" }, "filter": "Filter by match type", "allReasons": "All match types", "reasons": { "file_hash": "Identical file set", "isbn": "Same ISBN", "exact_metadata": "Exact title and authors", "fuzzy_metadata": "Similar title and author" }, "notDuplicates": "Not duplicates", "unknownAuthor": "Unknown author", "unknown": "Unknown", "none": "None", "accessDenied": "You do not have permission to use the duplicate book tool.", "pairDetails": "Why these matched", "pairLabel": "{first} and {second}", "fields": { "library": "Library", "isbn": "ISBN", "formats": "Formats", "collections": "Collections", "added": "Added", "size": "Size", "metadata": "Metadata", "reading": "Reading", "folder": "Folder", "noIsbn": "Not set", "notStarted": "Not started", "outOfHundred": "/100", "percentRead": "{percent} read", "fileCount": "{count, plural, one {# file} other {# files}}" }, "initial": { "title": "Find duplicate books", "description": "Choose a library scope and similarity level, then run a scan. No books are changed until you explicitly confirm a deletion." }, "empty": { "title": "No duplicate groups found", "description": "No books matched the current scope, similarity level, and match filter." }, "deleteDialog": { "warning": "Metadata, collections, reading data, and device state are not transferred to the kept book. Associated data for other users is also removed.", "confirm": "{count, plural, =0 {Delete # book} one {Delete # book} other {Delete # books}}", "success": "{count, plural, =0 {No books deleted} one {One duplicate book deleted} other {# duplicate books deleted}}" }, "errors": { "start": "Could not start the duplicate scan.", "status": "Could not load scan progress.", "scan": "The duplicate scan failed. Try running it again.", "results": "Could not load duplicate groups.", "delete": "Could not delete the selected duplicate books.", "dismiss": "Could not dismiss that group.", "restore": "Could not restore that pair." }, "pagination": { "label": "Duplicate groups pages", "page": "Page {page} of {total}" }, "similarityOption": "{percent} and up", "scannedBooks": "{count} books · checked {when}", "scanProgress": "{processed} of {total} books", "recommended": "Recommended", "keeping": "Keeping", "willDelete": "Delete", "keepCopy": "Keep {name}", "selectGroup": "Select {title}", "selectAll": "Select every group on this page", "compareCopies": "Compare the copies of {title}", "compareCaption": "Field by field comparison of {count} copies", "fieldColumn": "Field", "filesEach": "{count, plural, one {# file each} other {# files each}}", "moreFilesCount": "{count, plural, one {and # more file} other {and # more files}}", "identicalAcross": "{count, plural, one {Identical in both copies:} other {Identical in all # copies:}}", "deleteGroup": "{count, plural, one {Delete # copy, free {size}} other {Delete # copies, free {size}}}", "confidence": { "file_hash": "Identical", "isbn": "Same ISBN", "exact_metadata": "Exact match", "fuzzy_metadata": "Similar", "withSimilarity": "{label} {percent}" }, "summary": { "groups": "{count, plural, one {group} other {groups}}", "extraCopies": "{count, plural, one {extra copy} other {extra copies}}", "reclaimable": "reclaimable" }, "columns": { "match": "Match", "book": "Book", "copies": "Copies", "libraries": "Libraries", "frees": "Frees", "keeping": "Keeping" }, "keepRule": { "label": "Keep", "metadata": "Best metadata", "size": "Largest files", "formats": "Most formats", "oldest": "Oldest copy", "newest": "Newest copy", "hint": "Picks a keeper in every group. You can override any row." }, "sort": { "label": "Sort", "reclaimable": "Most space freed", "copies": "Most copies", "confidence": "Strongest match", "title": "Title A to Z" }, "keeper": { "yourChoice": "Your choice", "reading": "you are {percent} through it", "collection": "it is in {name}", "metadata": "metadata {score}", "largest": "largest at {size}", "formats": "{count} formats", "isbn": "has an ISBN", "added": "added {date}", "riskReading": "deletes a copy you are {percent} through", "riskCollection": "deletes a copy in {name}" }, "selection": { "summary": "{groups} groups selected, {copies} copies to delete, frees {size}", "clear": "Clear", "review": "{count, plural, one {Review # copy} other {Review # copies}}", "hint": "Tick the groups you trust, or open one to compare the copies." }, "keys": { "move": "move", "expand": "expand", "keep": "keep", "select": "select" }, "review": { "title": "{count, plural, one {Delete # copy} other {Delete # copies}}", "description": "Across {groups} groups, freeing {size}. Nothing is deleted until you confirm.", "riskWarning": "{count, plural, one {# group deletes a copy carrying your reading data.} other {# groups delete a copy carrying your reading data.}}", "footer": "Frees {size}" }, "dismissed": { "show": "{count, plural, one {Show # dismissed pair} other {Show # dismissed pairs}}", "hide": "Hide dismissed pairs", "restore": "Restore this pair", "restored": "Pair restored. It can match again on the next scan." } }, "entityManager": { "unknown": "Unknown", "bookCount": "{count, plural, =0 {no books} one {# book} other {# books}}", "sortPrefix": "· sort: {sortName}", "selectTargetToKeep": "Select target to keep", "writeToFiles": "Write to files", "writeChangesToFiles": "Write changes to files", "mergeIntoTarget": "Merge {count} into target", "modes": { "browse": "Browse & Manage", "duplicates": "Find Duplicates" }, "actions": { "rename": "Rename", "split": "Split", "merge": "Merge" }, "duplicates": { "similarity": "Similarity:", "scan": "Scan", "scanning": "Scanning...", "computing": "Computing candidates...", "computedAt": "Candidates computed {date}", "recompute": "Recompute", "noneComputed": "No candidates computed yet.", "computeNow": "Compute now", "emptyTitle": "Find duplicate entities", "emptyDescription": "Adjust the similarity threshold and click Scan to detect potential duplicates.", "noneFoundTitle": "No duplicates found", "noneFoundDescription": "No potential duplicates were detected with the current settings.", "clustersFound": "{count, plural, =0 {no clusters found} one {# cluster found} other {# clusters found}}", "plusOthers": "{count, plural, =0 {+ # other} one {+ # other} other {+ # others}}", "percentSimilar": "{percent}% similar", "pairDetails": "Pair details", "dismissEntityTitle": "Dismiss all pairs for this entity", "dismissPairTitle": "Dismiss this pair", "groupsLabel": "Possible duplicate groups", "keepThisOne": "Keep this one", "mergeAway": "Merge away", "notAMatch": "Not a match", "notAMatchTitle": "Dismiss every pair in this group", "selectPromptTitle": "Select a group to review", "selectPromptDescription": "Choose a group from the list to compare its entities side by side.", "backToList": "Back to groups", "noBookTitles": "No books linked to this record", "thresholdLabel": "Minimum similarity", "thresholdValue": "{percent}%+", "willBeMerged": "{count, plural, one {# entity will be merged and removed} other {# entities will be merged and removed}}", "chooseTargetHint": "Select the entity to keep. Everything else in the group merges into it." }, "dismissed": { "loading": "Loading dismissed pairs...", "empty": "No dismissed pairs", "restore": "Restore", "restoreTitle": "Restore this pair", "hidePairs": "Hide dismissed pairs", "showPairs": "Show dismissed pairs" }, "browse": { "searchPlaceholder": "Search...", "emptyOnly": "Empty only", "clear": "Clear", "noEntities": "No entities found", "mergeCount": "Merge ({count})", "deleteCount": "Delete ({count})", "totalCount": "{count} total", "sortLabel": "sort: {sortName}", "sort": { "nameAsc": "Name A-Z", "nameDesc": "Name Z-A", "fewestBooks": "Fewest books", "mostBooks": "Most books" }, "sortByLabel": "Sort by", "entityTypeLabel": "Entity type", "resultCount": "{count, plural, =0 {no entities} one {# entity} other {# entities}}", "selectedCount": "{count, plural, one {# selected} other {# selected}}", "columns": { "name": "Name", "sortName": "Sort name", "books": "Books", "status": "Status", "actions": "Actions" }, "selectAllOnPage": "Select all entities on this page", "selectEntity": "Select {name}", "actionsFor": "Actions for {name}", "status": { "noBooks": "No books" }, "filters": { "all": "All", "noBooks": "No books" }, "density": { "label": "Row height", "comfortable": "Comfortable", "compact": "Compact" }, "rowsPerPage": "Rows per page", "range": "Showing {from}-{to} of {total}", "pagination": "Pagination", "previousPage": "Previous page", "nextPage": "Next page", "goToPage": "Go to page {page}", "morePages": "More pages", "noEntitiesDescription": "Nothing has been added to this entity type yet.", "noMatchesTitle": "No matches", "noMatchesDescription": "No entities match your current search and filters.", "clearFilters": "Clear filters" }, "deleteMode": { "label": "Delete mode", "softTitle": "Soft delete", "softDescription": "Unlink from all books but keep the entity record", "softDescriptionPlural": "Unlink from all books but keep the entity records", "hardTitle": "Hard delete", "hardDescription": "Remove entity and all associations permanently", "hardDescriptionPlural": "Remove entities and all associations permanently" }, "renameModal": { "title": "Rename Entity", "currentName": "Current name", "newName": "New name" }, "deleteModal": { "title": "Delete Entity", "confirm": "Are you sure you want to delete {name}?" }, "splitModal": { "title": "Split Entity", "splitting": "Splitting", "newNames": "New names (min 2)", "namePlaceholder": "Enter name...", "addAnother": "Add another" }, "bulkDeleteModal": { "title": "Bulk Delete", "confirm": "{count, plural, =0 {Are you sure you want to delete # selected entity?} one {Are you sure you want to delete # selected entity?} other {Are you sure you want to delete # selected entities?}}", "deleteButton": "Delete {count}" }, "mergeModal": { "title": "Merge Entities", "description": "Select which entity to keep. The others will be merged into it and removed." } }, "missingResources": { "title": "Missing Resources", "accessDenied": "You do not have permission to clean up missing resources.", "categoriesLabel": "Cleanup category", "untitled": "Untitled", "clearSelection": "Clear selection", "cleanSelected": "Clean {count} selected", "selectAllMatching": "Select all {count} matching entries", "allSelected": "All {count} matching entries are selected.", "sweep": { "title": "Cover check", "description": "Checks every book that claims a cover against the files on disk, and looks for cover folders left behind by deleted books. Nothing is removed during the check.", "run": "Run check", "running": "Checking", "progress": "Checked {processed} of {total} books", "lastRun": "Last checked {at}", "truncated": "Only the first results are listed. Clean these, then run the check again to see the rest." }, "categories": { "missing_books": "Missing books", "broken_covers": "Broken covers", "orphaned_cover_dirs": "Orphaned cover folders" }, "found": { "missing_books": "{count, plural, =0 {No books with missing files} one {One book with missing files} other {# books with missing files}}", "broken_covers": "{count, plural, =0 {No broken cover references} one {One broken cover reference} other {# broken cover references}}", "orphaned_cover_dirs": "{count, plural, =0 {No orphaned cover folders} one {One orphaned cover folder} other {# orphaned cover folders}}" }, "empty": { "missing_books": "No missing books", "broken_covers": "No broken cover references", "orphaned_cover_dirs": "No orphaned cover folders", "description": "Everything in this category is accounted for." }, "needsSweep": { "title": "Run the cover check first", "description": "Cover results come from a disk check. Run it to see broken references and orphaned folders." }, "coverSource": { "extracted": "Extracted", "custom": "Custom" }, "brokenSlot": { "ebookExtracted": "Book cover, extracted", "ebookCustom": "Book cover, custom", "audioExtracted": "Audiobook cover, extracted", "audioCustom": "Audiobook cover, custom" }, "table": { "selectPage": "Select everything on this page", "coverFolder": "Cover folder for book #{bookId}", "fileCount": "{count, plural, one {# file} other {# files}}", "orphanMedia": { "ebook": "Book cover", "audio": "Audiobook cover", "both": "Book and audiobook covers" } }, "confirm": { "title": "Clean missing resources?", "action": "Clean", "missing_books": "{count, plural, one {Deletes the database record for one book whose files are gone. The book, its metadata, reading progress, and cover are removed. This cannot be undone.} other {Deletes the database records for # books whose files are gone. The books, their metadata, reading progress, and covers are removed. This cannot be undone.}}", "broken_covers": "{count, plural, one {Clears the cover reference for one book so it shows as having no cover. Metadata is not otherwise changed.} other {Clears the cover references for # books so they show as having no cover. Metadata is not otherwise changed.}}", "orphaned_cover_dirs": "{count, plural, one {Deletes one cover folder from disk. Its book is no longer in the database. This cannot be undone.} other {Deletes # cover folders from disk. Their books are no longer in the database. This cannot be undone.}}" }, "cleaned": { "missing_books": "{count, plural, =0 {Nothing to clean} one {Removed one missing book} other {Removed # missing books}}", "broken_covers": "{count, plural, =0 {Nothing to clean} one {Cleared one broken cover reference} other {Cleared # broken cover references}}", "orphaned_cover_dirs": "{count, plural, =0 {Nothing to clean} one {Removed one orphaned cover folder} other {Removed # orphaned cover folders}}" }, "pagination": { "label": "Missing resource pages", "page": "Page {page} of {total}" }, "errors": { "summary": "Could not load the missing resource summary.", "sweepStart": "Could not start the cover check.", "sweep": "The cover check failed.", "list": "Could not load these entries.", "clean": "Cleanup failed." } }, "chapterHealth": { "accessDenied": "You need permission to edit metadata to use this tool.", "untitled": "Untitled book", "categoriesLabel": "Chapter problems", "categories": { "no_chapters": "No chapters", "one_per_file": "One per file", "numbered_tracks": "Numbered tracks", "needs_review": "Needs review", "edited": "Edited" }, "hints": { "no_chapters": "Audiobooks in a single file with one chapter or none.", "one_per_file": "Audiobooks in several files with no chapters of their own, so each file plays as a chapter.", "numbered_tracks": "Chapters named like files or tracks, such as \"001\" or \"Track 03\", rather than chapters.", "needs_review": "Audible lookups that did not match your files well enough to apply on their own. Review opens the book's chapters with the lookup ready.", "edited": "Chapter lists a person has edited, shown for reference." }, "library": "Library", "allLibraries": "All libraries", "found": "{count, plural, =0 {No books here} one {# book} other {# books}}", "emptyTitle": "Nothing here", "clearSelection": "Clear selection", "row": { "select": "Select {title}", "facts": "{files, plural, one {# file} other {# files}}; {chapters, plural, =0 {no chapters} one {# chapter} other {# chapters}}; {library}", "files": "{count, plural, one {# file} other {# files}}", "chapters": "{count, plural, =0 {no chapters} one {# chapter} other {# chapters}}", "noAsin": "No ASIN", "review": "Review", "dismiss": "Dismiss" }, "reasons": { "runtime_mismatch": "Audible's runtime differs from your files by {seconds} s.", "runtime_mismatch_long": "Audible's runtime differs from your files by {duration}, so it is probably a different edition.", "runtime_unknown": "Audible does not list a runtime for this book, so its timings could not be checked against your files.", "not_exact": "Audible does not mark these timings as exact.", "implausible": "Audible's list does not look like chapters for this book.", "unknown_length": "This book's length is unknown.", "locked": "This book's chapters are protected, so nothing was replaced." }, "lookup": { "title": "Find chapters on Audible", "description": "Looks up each book that has an Audible ASIN. When Audible marks its timings exact and its runtime matches your files, the chapters are applied and protected, and the old list stays in the book's history. Everything else waits under Needs review.", "lookUpCategory": "{count, plural, =0 {No book here has an ASIN} one {Look up the # book with an ASIN} other {Look up the # books with an ASIN}}", "lookUpSelected": "{count, plural, one {Look up # selected book} other {Look up # selected books}}", "waiting": "{count, plural, =0 {Finishing up} one {# book waiting} other {# books waiting}}", "current": "Looking up {title}", "idle": "No lookups waiting.", "finished": "Finished: {applied} applied, {review} to review, {notFound} not found, {failed} failed", "stop": "Stop", "clear": "Clear", "queued": "{count, plural, =0 {No book was queued} one {# book queued} other {# books queued}}", "queuedWithSkipped": "{count, plural, =0 {No book was queued} one {# book queued} other {# books queued}}; {skipped, plural, one {# had no ASIN} other {# had no ASIN}}" }, "errors": { "load": "Chapter health could not be loaded.", "enqueue": "The lookups could not be queued.", "cancel": "The lookups could not be changed.", "dismiss": "The review could not be dismissed." } } }, "views": { "entity": { "book": "Book", "collection": "Collection", "library": "Library", "smartScope": "SmartScope" }, "common": { "retry": "Retry" }, "bookView": { "sortOn": "On", "resetSort": "Reset sort to default", "shuffle": "Shuffle", "shuffleAria": "Shuffle the book order", "shuffleHint": "Draw a new random order", "filters": "Filters", "clear": "Clear", "clearAllFilters": "Clear all filters", "expandSeries": "Expand series", "collapseSeries": "Collapse series", "collapseLockedWhileSelecting": "Series stay expanded while selecting", "expanded": "Expanded", "exportMetadata": "Export metadata", "showControlsAria": "Show library controls", "export": "Export", "searchPlaceholder": "Search title, author, series, narrator...", "allBooksLoaded": "All {count} books loaded" }, "notFound": { "title": "Page not found", "description": "The page you're looking for doesn't exist.", "goHome": "Go home" }, "dashboard": { "customize": "Customize dashboard", "allShelvesHidden": "All shelves are hidden.", "greeting": { "night": "Good night,", "morning": "Good morning,", "afternoon": "Good afternoon,", "evening": "Good evening,", "fallbackName": "there" } }, "bookDetail": { "title": "Book", "titleWithId": "Book #{id}", "pageTitle": { "book": "Book · {base}", "editMetadata": "Edit Metadata · {base}", "edit": "Edit · {base}", "files": "Files · {base}", "chapters": "Chapters · {base}", "readingLog": "Reading Log · {base}", "highlights": "Highlights · {base}" } }, "bookDock": { "title": "Book Dock", "newFilesDetected": "New files detected", "reconnecting": "Reconnecting", "rescanFailed": "Rescan failed", "totalInDock": "{size} in Book Dock", "dropFiles": "Drop files into Book Dock", "supportedFormats": "Supported: {formats}", "empty": { "noSearchMatch": "No files match \"{query}\"", "noStatusFiles": "No {status} files", "uploadPrompt": "Upload files or drop them in the Book Dock folder" }, "retry": { "noneToRetry": "No error files to retry", "retrying": "{count, plural, =0 {Retrying one file} one {Retrying one file} other {Retrying # files}}" }, "applyFetched": { "applied": "{count, plural, =0 {Applied to no files} one {Applied to one file} other {Applied to # files}}", "skippedEdited": "{count, plural, =0 {skipped one file because they have manual edits} one {skipped one file because it has manual edits} other {skipped # files because they have manual edits}}", "skippedNoMetadata": "{count, plural, =0 {skipped one file because they have no fetched metadata} one {skipped one file because it has no fetched metadata} other {skipped # files because they have no fetched metadata}}", "noneApplied": "No files applied; {reasons}", "noneSelected": "No files selected" } }, "collection": { "title": "Collection", "pageTitle": "Collection · {name}", "pageTitleWithId": "Collection #{id}", "editCollection": "Edit collection", "showControlsAria": "Show collection controls", "loadError": "Could not load this collection", "toast": { "removed": "{count, plural, =0 {Removed no books from collection} one {Removed one book from collection} other {Removed # books from collection}}", "removeFailed": "Failed to remove books from collection" }, "empty": { "noSearchMatch": "No books match this search", "noSearchMatchHint": "Try a different search term or clear the search.", "noBooks": "No books in this collection", "noBooksHint": "Select books from your library and add them here." } }, "library": { "title": "Library", "pageTitle": "Library · {name}", "pageTitleWithId": "Library #{id}", "filterRules": "Filter rules", "saveAsSmartScope": "Save as Smart Scope", "saveScope": "Save Scope", "saveAsSmartScopeTooltip": "Save this filter as a named Smart Scope", "saved": "Saved", "saveFilter": "Save filter", "filterSaved": "Filter saved", "saveFilterTooltip": "Save filter for this library", "removeSavedFilter": "Remove saved filter", "empty": { "noFilterMatch": "No books match your filters", "noFilterMatchHint": "Try adjusting or clearing your filters to see more books.", "clearFilters": "Clear filters", "scanning": "Scanning your library...", "scanningHint": "Books will appear here as they are discovered.", "emptyLibrary": "Your library is empty", "emptyLibraryHint": "Once you add books to this library, they will appear here." }, "querySelection": { "loadedSelected": "{selected} of {total} loaded books selected.", "selectAllMatching": "Select all {total} matching books" } }, "smartScope": { "title": "SmartScope", "pageTitle": "SmartScope · {name}", "pageTitleWithId": "SmartScope #{id}", "defaultName": "Smart scope", "filter": "Filter", "edit": "Edit Smart Scope", "koboSync": { "label": "Sync to my Kobo", "enabledHint": "Books in this shared Smart Scope sync to your Kobo device. Turn off to stop syncing them.", "disabledHint": "Turn on to sync books in this shared Smart Scope to your Kobo device." }, "showControlsAria": "Show Smart Scope controls", "hideFilter": "Hide filter", "showFilter": "Show filter", "confirmDelete": "Confirm?", "loadError": "Could not load this SmartScope", "toast": { "deleted": "\"{name}\" deleted", "deleteFailed": "Failed to delete \"{name}\"", "koboSyncEnabled": "\"{name}\" now syncs to your Kobo", "koboSyncDisabled": "\"{name}\" no longer syncs to your Kobo", "koboSyncFailed": "Failed to update Kobo sync for \"{name}\"" }, "empty": { "noRules": "No rules configured", "noRulesHint": "Open the editor to define which books appear in this smartScope using filters and sort rules.", "configure": "Configure SmartScope", "noMatch": "No books match this smartScope", "noMatchHint": "Try adjusting the filter rules.", "edit": "Edit SmartScope" } } }, "whatsNew": { "title": "What's New", "subtitle": "Everything that's shipped, newest first.", "versionPrefix": "Version {version}", "newUpdates": "{count, plural, =0 {no new updates} one {one new update} other {# new updates}}", "remindLater": "Remind me later", "gotIt": "Got it", "latest": "Latest", "fullChangelog": "Full changelog", "seeAllReleases": "See all releases", "versions": "Versions", "currentVersion": "Current version", "youreHere": "You're here", "searchPlaceholder": "Search releases…", "noReleasesFound": "No releases found.", "noHighlights": "No highlights for this release.", "showChangelog": "Show full changelog", "hideChangelog": "Hide full changelog", "openOnGitHub": "Open on GitHub", "loadMore": "Load more", "loadingMore": "Loading…", "loadFailed": "Failed to load releases", "loadMoreFailed": "Could not load more releases. Please try again.", "loadErrorHint": "Couldn't load releases. Check your connection and try again.", "retry": "Retry", "imageViewer": "Image viewer", "closeImage": "Close image", "previousImage": "Previous image", "nextImage": "Next image" }, "titles": { "dashboard": "Dashboard", "libraries": "Libraries", "opds": "OPDS", "koboSync": "Kobo Sync", "koreaderSync": "KOReader Sync", "bookDock": "Book Dock", "whatsNew": "What's New", "annotations": "Annotations", "achievements": "Achievements", "statistics": "Statistics", "authors": "Authors", "series": "Series", "entityManager": "Entity Manager", "bulkRename": "Bulk Rename", "duplicateBooks": "Duplicate Books", "notFound": "Not Found", "signIn": "Sign In", "initialSetup": "Initial Setup", "register": "Create Account", "forgotPassword": "Forgot Password", "resetPassword": "Reset Password", "completingSignIn": "Completing Sign In", "magicLinkLogin": "Magic Link Login", "readPrefix": "Read", "emailSuffix": "Email", "library": "Library", "smartScope": "SmartScope", "collection": "Collection", "author": "Author", "book": "Book", "seriesItem": "Series", "appearance": { "theme": "Display", "book-covers": "Book Covers", "icons": "Icons", "layout": "Display Layout", "behavior": "Library Behavior", "language": "Language" }, "reader": { "general": "Reader Settings", "ebook": "eBook Reader", "pdf": "PDF Reader", "comics": "Comics Reader", "audio": "Audiobook Player", "fonts": "Reader Fonts" }, "email": { "providers": "Providers", "servers": "Mail servers", "recipients": "Recipients", "groups": "Groups", "templates": "Templates", "preferences": "Preferences", "history": "History" }, "metadata": { "providers": "Providers", "field-rules": "Field-Level Rules", "custom-fields": "Custom Metadata", "genre-blocklist": "Genre Blocklist", "score": "Confidence Score", "auto-fetch": "Book Auto-Fetch", "authors": "Author Auto-Fetch", "search-cache": "Search Cache" }, "admin": { "users": "Users", "account-activity": "Account Activity", "magic-links": "Magic Links", "oidc": "OIDC / SSO", "server-fonts": "Server Fonts", "tts": "Text-to-Speech" }, "system": { "file-naming": "File Naming", "book-dock": "Book Dock", "requests": "Requests", "maintenance": "Maintenance", "audit-log": "Audit Log" }, "account": { "profile": "Account", "privacy": "Privacy & Sharing", "notifications": "Notifications", "restrictions": "Content Restrictions" }, "smartScopes": "Smart Scopes", "collections": "Collections", "missingResources": "Missing Resources", "bookRequests": "Requests", "bookRequestDetail": "Request", "bookRequestReleases": "Pick a release", "tts": "Text-to-Speech", "chapterHealth": "Chapter Health", "readingHistory": "Reading History" }, "tts": { "readerControls": { "listen": "Listen", "playing": "Playing" }, "player": { "fallbackTitle": "TTS Playback", "play": "Play TTS", "pause": "Pause TTS", "openMiniPlayer": "Open mini player", "shrinkPlayer": "Shrink player", "expandPlayer": "Expand player", "collapsePlayer": "Collapse player", "openDetails": "Open player details", "previousSentence": "Previous sentence", "nextSentence": "Next sentence", "meta": "Ch {chapter} - Sent {sentence} - {voice} - {speed}x", "metaWithoutVoice": "Ch {chapter} - Sent {sentence} - {speed}x", "position": "Chapter {chapter} - Sentence {sentence}", "playbackError": "Playback error - tap play to retry", "voice": "Voice", "sleep": "Sleep", "sleepRemaining": "{count}m", "currentVoice": "Current Voice", "chooseVoice": "Choose voice", "saveForBook": "Save for this book", "setAsDefault": "Set as global default", "bookVoiceSaved": "Voice saved for this book", "bookVoiceSaveFailed": "Failed to save book voice", "defaultVoiceSaved": "Default TTS voice updated", "defaultVoiceSaveFailed": "Failed to update default voice", "stop": "Stop" }, "speed": { "label": "Playback speed", "value": "{speed}x" }, "sleepTimer": { "title": "Sleep Timer", "preset": "{count}m", "presetLabel": "Stop playback after {count} minutes", "cancel": "Cancel", "cancelLabel": "Cancel sleep timer", "remaining": "Stops in {minutes}m {seconds}s" }, "resume": { "title": "Resume TTS?", "description": "You have a saved TTS position", "descriptionWithChapter": "You have a saved TTS position (Chapter {chapter})", "resume": "Resume", "startHere": "Start this page", "dismiss": "Dismiss", "clearing": "Clearing...", "confirmClear": "Confirm clear", "clearSavedPosition": "Clear saved position" }, "voicePicker": { "search": "Search voices...", "allProviders": "All", "allLanguages": "All languages", "allCountries": "All countries", "filterByLanguage": "Filter by language", "filterByCountry": "Filter by country", "empty": "No voices found", "select": "Select {name}", "preview": "Preview {name}", "voiceWithLocale": "{voice} - {locale}" }, "settings": { "description": "Configure your default TTS voice and playback settings.", "defaultVoice": "Default Voice", "selectVoice": "Select a voice...", "change": "Change", "defaultSpeed": "Default Speed", "saved": "TTS preferences saved", "saveFailed": "Failed to save TTS preferences" }, "errors": { "generic": "TTS error" } }, "delivery": { "readAloud": { "label": "Read-aloud EPUB delivery", "automatic": "Automatic: prefer text-only, allow original fallback.", "textOnly": "Text-only EPUB", "original": "Original EPUB with narration", "hint": "Applies to future deliveries. Originals preserve existing narration and can be much larger. Text-only preparation fails if a safe copy cannot be made.", "koboHint": "Original EPUBs bypass KEPUB conversion. Native Kobo firmware may not play narration, and precise position and highlight sync are unavailable for that copy.", "profileHint": "Use separate OPDS profiles for readers that need different EPUB variants.", "replacementTitle": "Replace a Kobo copy", "bookId": "Book ID", "device": "Device", "prepare": "Prepare replacement", "offer": "I removed only the device copy; offer the replacement", "confirm": "I installed the replacement", "cancel": "Cancel replacement", "replacementHint": "Prepare and review first. Removing a device copy does not delete the library book. Back up device-local notes yourself. BookOrbit preserves canonical progress and server annotations. Delayed events can limit precise sync.", "prepared": "Replacement prepared: {format}, {size}. Remove this book only from the selected device, then offer the prepared replacement and sync.", "offered": "Replacement offered. Sync and download on the device, then confirm installation. A completed HTTP transfer does not prove installation.", "cancelled": "Replacement cancelled. Cancellation does not restore a removed or partially replaced device copy. Select the same book to prepare a recovery download.", "alreadyOnDevice": "The device already has this exact copy, so there is nothing to replace.", "failed": "Could not prepare or update this replacement.", "searchBook": "Search for a book", "chooseBook": "Select a book", "moreResults": "Show more books", "noResults": "No matching books found.", "refresh": "Refresh delivery status", "confirmed": "You confirmed installation. This records your confirmation, not device verification.", "transferred": "The transfer completed. Open the replacement on the device before confirming installation.", "koreaderDefaultTitle": "KOReader EPUB delivery", "koreaderDefaultHint": "The default applies to future downloads on devices using these credentials. Device settings can override it. Existing copies and interrupted downloads stay unchanged. Automatic preserves existing device choices.", "koreaderUseDefault": "Use credential default", "koreaderSaveFailed": "Could not save the KOReader EPUB delivery setting. Try again.", "koreaderSaved": "KOReader EPUB delivery setting saved." } }, "commandPalette": { "title": "Search", "description": "Search books, authors, series and settings, jump to a place, or run an action.", "placeholder": "Search books, authors, series, or go to…", "close": "Close search", "clear": "Clear search", "tabs": { "all": "All", "books": "Books", "authors": "Authors", "series": "Series", "settings": "Settings" }, "sections": { "continueReading": "Continue Reading", "goTo": "Go to", "actions": "Actions", "books": "Books", "authors": "Authors", "series": "Series", "settings": "Settings" }, "kinds": { "author": "Author", "series": "Series", "library": "Library", "smartScope": "Smart scope", "collection": "Collection", "page": "Page", "setting": "Setting" }, "showAllBooks": "{count, plural, one {Show # book} other {Show all # books}}", "showAllAuthors": "{count, plural, one {Show # author} other {Show all # authors}}", "showAllSeries": "{count, plural, one {Show # series} other {Show all # series}}", "showAllSettings": "{count, plural, one {Show # setting} other {Show all # settings}}", "actions": { "lightTheme": "Switch to light theme", "darkTheme": "Switch to dark theme" }, "hints": { "navigate": "Navigate", "open": "Open", "filter": "Filter", "close": "Close" }, "keys": { "escape": "esc", "tab": "tab" }, "resultCount": "{count, plural, =0 {No results} one {# result} other {# results}}" }, "serverText": { "achievements": { "books_finished_1": { "name": "Ink Initiate", "description": "Finish your first book" }, "books_finished_2": { "name": "Spine Scout", "description": "Finish 10 books" }, "books_finished_3": { "name": "Story Stalwart", "description": "Finish 35 books" }, "books_finished_4": { "name": "Grand Archivist", "description": "Finish 100 books" }, "pages_read_1": { "name": "First Leaves", "description": "Read 500 pages" }, "pages_read_2": { "name": "Chapter Weaver", "description": "Read 5,000 pages" }, "pages_read_3": { "name": "Tome Tactician", "description": "Read 25,000 pages" }, "pages_read_4": { "name": "Grand Lexicon", "description": "Read 100,000 pages" }, "hours_read_1": { "name": "Hour Initiate", "description": "Read for 10 hours" }, "hours_read_2": { "name": "Timebound Reader", "description": "Read for 100 hours" }, "hours_read_3": { "name": "Chronicle Veteran", "description": "Read for 500 hours" }, "hours_read_4": { "name": "Timeless Scholar", "description": "Read for 1,000 hours" }, "marathoner": { "name": "Marathoner", "description": "Complete a reading session of 90 minutes or more" }, "all_nighter": { "name": "All-nighter", "description": "Read between 1am and 4am" }, "early_bird": { "name": "Early Bird", "description": "Start a reading session between 5am and 7am" }, "long_book_1": { "name": "Story Stretch", "description": "Finish a book with 300 or more pages" }, "page_turner": { "name": "Page Pathfinder", "description": "Finish a book with 500 or more pages" }, "long_book_3": { "name": "Epic Voyager", "description": "Finish a book with 750 or more pages" }, "tome_tamer": { "name": "Tome Sovereign", "description": "Finish a book with 1,000 or more pages" }, "sprint": { "name": "Sprint", "description": "Finish a book in a single day" }, "binge_reader": { "name": "Binge Reader", "description": "Finish 3 or more books in a single week" }, "library_builder_1": { "name": "Shelf Seed", "description": "Have 50 books in your library" }, "library_builder_2": { "name": "Collection Architect", "description": "Have 250 books in your library" }, "library_builder_3": { "name": "Stack Sovereign", "description": "Have 1,000 books in your library" }, "library_builder_4": { "name": "Library of Alexandria", "description": "Have 5,000 books in your library" }, "annotator_1": { "name": "Note Taker", "description": "Create 10 annotations" }, "annotator_2": { "name": "Active Annotator", "description": "Create 50 annotations" }, "annotator_3": { "name": "Prolific Annotator", "description": "Create 200 annotations" }, "annotator_4": { "name": "Master Annotator", "description": "Create 500 annotations" }, "multi_format": { "name": "Multi-Format", "description": "Own books in 3 or more different formats" }, "curator": { "name": "Curator", "description": "Create 10 or more collections" }, "genre_explorer_1": { "name": "Genre Curious", "description": "Finish books in 5 different genres" }, "genre_explorer_2": { "name": "Genre Adventurer", "description": "Finish books in 10 different genres" }, "genre_explorer_3": { "name": "Genre Connoisseur", "description": "Finish books in 15 different genres" }, "genre_explorer_4": { "name": "Genre Master", "description": "Finish books in 20 different genres" }, "polyglot_1": { "name": "Bilingual", "description": "Finish books in 2 different languages" }, "polyglot_2": { "name": "Trilingual", "description": "Finish books in 3 different languages" }, "polyglot_3": { "name": "Multilingual", "description": "Finish books in 5 different languages" }, "polyglot_4": { "name": "Polyglot", "description": "Finish books in 7 different languages" }, "old_soul": { "name": "Old Soul", "description": "Finish a book published before 1900" }, "new_release": { "name": "New Release", "description": "Finish a book published in the current year" }, "century_span": { "name": "Century Span", "description": "Finish books from 3 or more different centuries" }, "author_deep_dive": { "name": "Author Deep Dive", "description": "Read 5 or more books by the same author" }, "streak_1": { "name": "Getting Started", "description": "Maintain a 7-day reading streak" }, "streak_2": { "name": "Habitual", "description": "Maintain a 30-day reading streak" }, "streak_3": { "name": "Unstoppable", "description": "Maintain a 100-day reading streak" }, "streak_4": { "name": "Year-Long Flame", "description": "Maintain a 365-day reading streak" }, "year_round_reader": { "name": "Year-Round Reader", "description": "Read in all 12 months of a calendar year" }, "reborn": { "name": "Reborn", "description": "Finish a book you had abandoned for over 6 months" }, "comeback_kid": { "name": "Comeback Kid", "description": "Resume reading after a 30-day break" }, "bookmarked": { "name": "Bookmarked", "description": "Create your first annotation or highlight" }, "new_year_reader": { "name": "New Year Reader", "description": "Complete a reading session on January 1st" }, "monthly_reader_2": { "name": "Monthly Machine", "description": "Finish 10 books in a single calendar month" }, "slow_burn": { "name": "Slow Burn", "description": "Take over 90 days from start to finish a book" }, "one_sitting": { "name": "One Sitting", "description": "Cover 90% or more of a book in a single reading session" }, "decade_sampler": { "name": "Decade Sampler", "description": "Finish books published in 5 different decades" }, "short_story_fan": { "name": "Short Story Fan", "description": "Finish 5 books with fewer than 100 pages" }, "thick_and_thin": { "name": "Thick and Thin", "description": "Finish at least one book under 100 pages and one over 800 pages" }, "trilogy_master": { "name": "Trilogy Master", "description": "Finish a complete 3-book series" }, "genre_devotee": { "name": "Genre Devotee", "description": "Finish 10 books in the same genre" }, "seasonal_reader": { "name": "Four Seasons", "description": "Read in all 4 seasons within a single year" }, "perfect_month": { "name": "Perfect Month", "description": "Read every day of a calendar month" }, "consistent_reader": { "name": "Consistency Is Key", "description": "Read at least 30 minutes every day for 14 consecutive days" }, "weekend_rhythm": { "name": "Weekend Rhythm", "description": "Read on 8 consecutive weekends" }, "weekend_warrior": { "name": "Weekend Warrior", "description": "Read for 5 or more hours in a single weekend" }, "yearly_finisher_12": { "name": "Yearly Closer", "description": "Finish 12 books in a single calendar year" }, "note_keeper": { "name": "Note Keeper", "description": "Create 25 annotations that include a note" }, "deep_dive_session": { "name": "Deep Dive", "description": "Create 10 annotations in a single day" }, "first_series": { "name": "Series Begun", "description": "Finish your first book that belongs to a named series" }, "category_sweeper": { "name": "Category Sweeper", "description": "Earn at least one achievement in all 4 categories" }, "power_hour": { "name": "Power Hour", "description": "Read 75 or more pages in a single reading session" }, "speed_reader": { "name": "Speed Reader", "description": "Read 100 or more pages in a single day" }, "old_friend": { "name": "Old Friend", "description": "Finish a book you were re-reading" }, "dnf_self_aware": { "name": "It's Not You, It's Me", "description": "Mark a book as abandoned" }, "first_verdict": { "name": "First Verdict", "description": "Rate your first book" }, "critic_1": { "name": "Fledgling Critic", "description": "Rate 10 books" }, "critic_2": { "name": "Seasoned Critic", "description": "Rate 50 books" }, "critic_3": { "name": "Esteemed Critic", "description": "Rate 200 books" }, "critic_4": { "name": "Definitive Critic", "description": "Rate 500 books" }, "standing_ovation": { "name": "Standing Ovation", "description": "Give a book a 5-star rating" }, "across_the_board": { "name": "Across the Board", "description": "Use all five star ratings at least once" }, "tough_crowd": { "name": "Tough Crowd", "description": "Give 10 books a rating of 2 stars or lower" }, "wordsmith": { "name": "Wordsmith", "description": "Write a note longer than 280 characters" }, "box_of_crayons": { "name": "Box of Crayons", "description": "Use all 5 highlight colors" }, "synced_up": { "name": "Synced Up", "description": "Sync reading progress from a Kobo or KOReader device for the first time" }, "full_orbit": { "name": "Full Orbit", "description": "Log reading from three different reading sources" }, "two_worlds": { "name": "Two Worlds", "description": "Read the same book from two or more different sources" } }, "achievementCategories": { "reading": "Reading", "library": "Library", "exploration": "Exploration", "dedication": "Dedication", "devices": "Devices" }, "achievementSecret": { "name": "Secret Achievement", "description": "Keep reading to reveal this achievement." }, "monthlyChallenge": { "short-read": { "title": "Quick Read", "description": "Finish a book under 200 pages this month" }, "genre-explorer": { "title": "Genre Explorer", "description": "Read a book in a genre new to you this month" }, "finish-oldest": { "title": "Clear the Backlog", "description": "Finish your oldest in-progress book" }, "streak-builder": { "title": "Streak Builder", "description": "Read for 5 consecutive days this month" }, "new-author": { "title": "New Voice", "description": "Read a book by an author new to you this month" }, "page-milestone": { "title": "Page Turner", "description": "Read 500 pages this month" } } } }