Some checks failed
CI / Backend (push) Successful in 30s
Release / Test backend (push) Failing after 11s
Release / Docker / backend (push) Has been skipped
Release / Docker / runner (push) Has been skipped
CI / UI (push) Successful in 35s
Release / Docker / caddy (push) Successful in 58s
Release / Check ui (push) Successful in 1m7s
CI / Backend (pull_request) Successful in 31s
CI / UI (pull_request) Successful in 1m1s
Release / Docker / ui (push) Failing after 2m43s
Release / Gitea Release (push) Has been skipped
Three light variants mirroring the existing dark set. All use CSS custom properties so no component changes are needed. Theme dots in the header and mobile drawer show a separator between dark/light groups; light-theme swatches get a subtle ring so they're visible on light backgrounds. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
414 lines
17 KiB
JSON
414 lines
17 KiB
JSON
{
|
|
"$schema": "https://inlang.com/schema/inlang-message-format",
|
|
|
|
"nav_library": "Library",
|
|
"nav_catalogue": "Catalogue",
|
|
"nav_feedback": "Feedback",
|
|
"nav_admin": "Admin",
|
|
"nav_profile": "Profile",
|
|
"nav_sign_in": "Sign in",
|
|
"nav_sign_out": "Sign out",
|
|
"nav_toggle_menu": "Toggle menu",
|
|
"nav_admin_panel": "Admin panel",
|
|
|
|
"footer_library": "Library",
|
|
"footer_catalogue": "Catalogue",
|
|
"footer_feedback": "Feedback",
|
|
"footer_disclaimer": "Disclaimer",
|
|
"footer_privacy": "Privacy",
|
|
"footer_dmca": "DMCA",
|
|
"footer_copyright": "© {year} libnovel",
|
|
"footer_dev": "dev",
|
|
|
|
"home_title": "libnovel",
|
|
"home_stat_books": "Books",
|
|
"home_stat_chapters": "Chapters",
|
|
"home_stat_in_progress": "In progress",
|
|
"home_continue_reading": "Continue Reading",
|
|
"home_view_all": "View all",
|
|
"home_recently_updated": "Recently Updated",
|
|
"home_from_following": "From People You Follow",
|
|
"home_empty_title": "Your library is empty",
|
|
"home_empty_body": "Discover novels and scrape them into your library.",
|
|
"home_discover_novels": "Discover Novels",
|
|
"home_via_reader": "via {username}",
|
|
"home_chapter_badge": "ch.{n}",
|
|
|
|
"player_generating": "Generating… {percent}%",
|
|
"player_loading": "Loading…",
|
|
"player_chapters": "Chapters",
|
|
"player_chapter_n": "Chapter {n}",
|
|
"player_toggle_chapter_list": "Toggle chapter list",
|
|
"player_chapter_list_label": "Chapter list",
|
|
"player_close_chapter_list": "Close chapter list",
|
|
"player_rewind_15": "Rewind 15 seconds",
|
|
"player_skip_30": "Skip 30 seconds",
|
|
"player_back_15": "Back 15s",
|
|
"player_forward_30": "Forward 30s",
|
|
"player_play": "Play",
|
|
"player_pause": "Pause",
|
|
"player_speed_label": "Playback speed {speed}x",
|
|
"player_seek_label": "Chapter progress",
|
|
"player_change_speed": "Change playback speed",
|
|
"player_auto_next_on": "Auto-next on",
|
|
"player_auto_next_off": "Auto-next off",
|
|
"player_auto_next_ready": "Auto-next on — Ch.{n} ready",
|
|
"player_auto_next_preparing": "Auto-next on — preparing Ch.{n}…",
|
|
"player_auto_next_aria": "Auto-next {state}",
|
|
"player_go_to_chapter": "Go to chapter",
|
|
"player_close": "Close player",
|
|
|
|
"login_page_title": "Sign in — libnovel",
|
|
"login_heading": "Sign in to libnovel",
|
|
"login_subheading": "Choose a provider to continue",
|
|
"login_continue_google": "Continue with Google",
|
|
"login_continue_github": "Continue with GitHub",
|
|
"login_terms_notice": "By signing in you agree to our terms of service.",
|
|
"login_error_oauth_state": "Sign-in was cancelled or expired. Please try again.",
|
|
"login_error_oauth_failed": "Could not connect to the provider. Please try again.",
|
|
"login_error_oauth_no_email": "Your account has no verified email address. Please add one and retry.",
|
|
|
|
"books_page_title": "Library — libnovel",
|
|
"books_heading": "Your Library",
|
|
"books_empty_title": "No books yet",
|
|
"books_empty_body": "Add books to your library by visiting a book page.",
|
|
"books_browse_catalogue": "Browse Catalogue",
|
|
"books_chapter_count": "{n} chapters",
|
|
"books_last_read": "Last read: Ch.{n}",
|
|
"books_reading_progress": "Ch.{current} / {total}",
|
|
"books_remove": "Remove",
|
|
|
|
"catalogue_page_title": "Catalogue — libnovel",
|
|
"catalogue_heading": "Catalogue",
|
|
"catalogue_search_placeholder": "Search novels…",
|
|
"catalogue_filter_genre": "Genre",
|
|
"catalogue_filter_status": "Status",
|
|
"catalogue_filter_sort": "Sort",
|
|
"catalogue_sort_popular": "Popular",
|
|
"catalogue_sort_new": "New",
|
|
"catalogue_sort_top_rated": "Top Rated",
|
|
"catalogue_sort_rank": "Rank",
|
|
"catalogue_status_all": "All",
|
|
"catalogue_status_ongoing": "Ongoing",
|
|
"catalogue_status_completed": "Completed",
|
|
"catalogue_genre_all": "All genres",
|
|
"catalogue_clear_filters": "Clear",
|
|
"catalogue_reset": "Reset",
|
|
"catalogue_no_results": "No novels found.",
|
|
"catalogue_loading": "Loading…",
|
|
"catalogue_load_more": "Load more",
|
|
"catalogue_results_count": "{n} results",
|
|
|
|
"book_detail_page_title": "{title} — libnovel",
|
|
"book_detail_signin_to_save": "Sign in to save",
|
|
"book_detail_add_to_library": "Add to Library",
|
|
"book_detail_remove_from_library": "Remove from Library",
|
|
"book_detail_read_now": "Read Now",
|
|
"book_detail_continue_reading": "Continue Reading",
|
|
"book_detail_start_reading": "Start Reading",
|
|
"book_detail_chapters": "{n} Chapters",
|
|
"book_detail_status": "Status",
|
|
"book_detail_author": "Author",
|
|
"book_detail_genres": "Genres",
|
|
"book_detail_description": "Description",
|
|
"book_detail_source": "Source",
|
|
"book_detail_rescrape": "Re-scrape",
|
|
"book_detail_scraping": "Scraping…",
|
|
"book_detail_in_library": "In Library",
|
|
|
|
"chapters_page_title": "Chapters — {title}",
|
|
"chapters_heading": "Chapters",
|
|
"chapters_back_to_book": "Back to book",
|
|
"chapters_reading_now": "Reading",
|
|
"chapters_empty": "No chapters scraped yet.",
|
|
|
|
"reader_page_title": "{title} — Ch.{n} — libnovel",
|
|
"reader_play_narration": "Play narration",
|
|
"reader_generating_audio": "Generating audio…",
|
|
"reader_signin_for_audio": "Audio narration available",
|
|
"reader_signin_audio_desc": "Sign in to listen to this chapter narrated by AI.",
|
|
"reader_audio_error": "Audio generation failed.",
|
|
"reader_prev_chapter": "Previous chapter",
|
|
"reader_next_chapter": "Next chapter",
|
|
"reader_back_to_chapters": "Back to chapters",
|
|
"reader_chapter_n": "Chapter {n}",
|
|
"reader_change_voice": "Change voice",
|
|
"reader_voice_panel_title": "Select voice",
|
|
"reader_voice_kokoro": "Kokoro voices",
|
|
"reader_voice_pocket": "Pocket-TTS voices",
|
|
"reader_voice_play_sample": "Play sample",
|
|
"reader_voice_stop_sample": "Stop sample",
|
|
"reader_voice_selected": "Selected",
|
|
"reader_close_voice_panel": "Close voice panel",
|
|
"reader_auto_next": "Auto-next",
|
|
"reader_speed": "Speed",
|
|
"reader_preview_notice": "Preview — this chapter has not been fully scraped.",
|
|
|
|
"profile_page_title": "Profile — libnovel",
|
|
"profile_heading": "Profile",
|
|
"profile_avatar_label": "Avatar",
|
|
"profile_change_avatar": "Change avatar",
|
|
"profile_username": "Username",
|
|
"profile_email": "Email",
|
|
"profile_change_password": "Change password",
|
|
"profile_current_password": "Current password",
|
|
"profile_new_password": "New password",
|
|
"profile_confirm_password": "Confirm password",
|
|
"profile_save_password": "Save password",
|
|
"profile_appearance_heading": "Appearance",
|
|
"profile_theme_label": "Theme",
|
|
"profile_theme_amber": "Amber",
|
|
"profile_theme_slate": "Slate",
|
|
"profile_theme_rose": "Rose",
|
|
"profile_theme_light": "Light",
|
|
"profile_theme_light_slate": "Light Blue",
|
|
"profile_theme_light_rose": "Light Rose",
|
|
"profile_reading_heading": "Reading settings",
|
|
"profile_voice_label": "Default voice",
|
|
"profile_speed_label": "Playback speed",
|
|
"profile_auto_next_label": "Auto-next chapter",
|
|
"profile_save_settings": "Save settings",
|
|
"profile_settings_saved": "Settings saved.",
|
|
"profile_settings_error": "Failed to save settings.",
|
|
"profile_password_saved": "Password changed.",
|
|
"profile_password_error": "Failed to change password.",
|
|
"profile_sessions_heading": "Active sessions",
|
|
"profile_sign_out_all": "Sign out all other devices",
|
|
"profile_joined": "Joined {date}",
|
|
|
|
"user_page_title": "{username} — libnovel",
|
|
"user_library_heading": "{username}'s Library",
|
|
"user_follow": "Follow",
|
|
"user_unfollow": "Unfollow",
|
|
"user_followers": "{n} followers",
|
|
"user_following": "{n} following",
|
|
"user_library_empty": "No books in library.",
|
|
|
|
"error_not_found_title": "Page not found",
|
|
"error_not_found_body": "The page you're looking for doesn't exist.",
|
|
"error_generic_title": "Something went wrong",
|
|
"error_go_home": "Go home",
|
|
"error_status": "Error {status}",
|
|
|
|
"admin_scrape_page_title": "Scrape — Admin",
|
|
"admin_scrape_heading": "Scrape",
|
|
"admin_scrape_catalogue": "Scrape Catalogue",
|
|
"admin_scrape_book": "Scrape Book",
|
|
"admin_scrape_url_placeholder": "novelfire.net book URL",
|
|
"admin_scrape_range": "Chapter range",
|
|
"admin_scrape_from": "From",
|
|
"admin_scrape_to": "To",
|
|
"admin_scrape_submit": "Scrape",
|
|
"admin_scrape_cancel": "Cancel",
|
|
"admin_scrape_status_pending": "Pending",
|
|
"admin_scrape_status_running": "Running",
|
|
"admin_scrape_status_done": "Done",
|
|
"admin_scrape_status_failed": "Failed",
|
|
"admin_scrape_status_cancelled": "Cancelled",
|
|
"admin_tasks_heading": "Recent tasks",
|
|
"admin_tasks_empty": "No tasks yet.",
|
|
|
|
"admin_audio_page_title": "Audio — Admin",
|
|
"admin_audio_heading": "Audio Jobs",
|
|
"admin_audio_empty": "No audio jobs.",
|
|
|
|
"admin_changelog_page_title": "Changelog — Admin",
|
|
"admin_changelog_heading": "Changelog",
|
|
|
|
"comments_heading": "Comments",
|
|
"comments_empty": "No comments yet. Be the first!",
|
|
"comments_placeholder": "Write a comment…",
|
|
"comments_submit": "Post",
|
|
"comments_login_prompt": "Sign in to comment.",
|
|
"comments_vote_up": "Upvote",
|
|
"comments_vote_down": "Downvote",
|
|
"comments_delete": "Delete",
|
|
"comments_reply": "Reply",
|
|
"comments_show_replies": "Show {n} replies",
|
|
"comments_hide_replies": "Hide replies",
|
|
"comments_edited": "edited",
|
|
"comments_deleted": "[deleted]",
|
|
|
|
"disclaimer_page_title": "Disclaimer — libnovel",
|
|
"privacy_page_title": "Privacy Policy — libnovel",
|
|
"dmca_page_title": "DMCA — libnovel",
|
|
"terms_page_title": "Terms of Service — libnovel",
|
|
|
|
"common_loading": "Loading…",
|
|
"common_error": "Error",
|
|
"common_save": "Save",
|
|
"common_cancel": "Cancel",
|
|
"common_close": "Close",
|
|
"common_search": "Search",
|
|
"common_back": "Back",
|
|
"common_next": "Next",
|
|
"common_previous": "Previous",
|
|
"common_yes": "Yes",
|
|
"common_no": "No",
|
|
"common_on": "on",
|
|
"common_off": "off",
|
|
|
|
"locale_switcher_label": "Language",
|
|
|
|
"books_empty_library": "Your library is empty.",
|
|
"books_empty_discover": "Books you start reading or save from",
|
|
"books_empty_discover_link": "Discover",
|
|
"books_empty_discover_suffix": "will appear here.",
|
|
"books_count": "{n} book{s}",
|
|
|
|
"catalogue_sort_updated": "Updated",
|
|
"catalogue_search_button": "Search",
|
|
"catalogue_refresh": "Refresh",
|
|
"catalogue_refreshing": "Queuing\u2026",
|
|
"catalogue_refresh_mobile": "Refresh catalogue",
|
|
"catalogue_all_loaded": "All novels loaded",
|
|
"catalogue_scroll_top": "Back to top",
|
|
"catalogue_view_grid": "Grid view",
|
|
"catalogue_view_list": "List view",
|
|
"catalogue_browse_source": "Browse novels from novelfire.net",
|
|
"catalogue_search_results": "{n} result{s} for \"{q}\"",
|
|
"catalogue_search_local_count": "({local} local, {remote} from novelfire)",
|
|
"catalogue_rank_ranked": "{n} novels ranked from last catalogue scrape",
|
|
"catalogue_rank_no_data": "No ranking data.",
|
|
"catalogue_rank_no_data_body": "No ranking data \u2014 run a full catalogue scrape to populate",
|
|
"catalogue_rank_run_scrape_admin": "Click Refresh catalogue above to trigger a full catalogue scrape.",
|
|
"catalogue_rank_run_scrape_user": "Ask an admin to run a catalogue scrape.",
|
|
"catalogue_scrape_queued_flash": "Full catalogue scrape queued. Library and ranking will update as books are processed.",
|
|
"catalogue_scrape_busy_flash": "A scrape job is already running. Check back once it finishes.",
|
|
"catalogue_scrape_error_flash": "Failed to queue scrape. Check that the scraper service is reachable.",
|
|
"catalogue_filters_label": "Filters",
|
|
"catalogue_apply": "Apply",
|
|
"catalogue_filter_rank_note": "Genre & status filters apply to Browse only",
|
|
"catalogue_no_results_search": "No results found.",
|
|
"catalogue_no_results_try": "Try a different search term.",
|
|
"catalogue_no_results_filters": "Try different filters or check back later.",
|
|
"catalogue_scrape_queued_badge": "Queued",
|
|
"catalogue_scrape_busy_badge": "Scraper busy",
|
|
"catalogue_scrape_busy_list": "Busy",
|
|
"catalogue_scrape_forbidden_badge": "Forbidden",
|
|
"catalogue_scrape_novel_button": "Scrape",
|
|
"catalogue_scraping_novel": "Scraping\u2026",
|
|
|
|
"book_detail_not_in_library": "not in library",
|
|
"book_detail_continue_ch": "Continue ch.{n}",
|
|
"book_detail_start_ch1": "Start from ch.1",
|
|
"book_detail_preview_ch1": "Preview ch.1",
|
|
"book_detail_reading_ch": "Reading ch.{n} of {total}",
|
|
"book_detail_n_chapters": "{n} chapters",
|
|
"book_detail_rescraping": "Queuing\u2026",
|
|
"book_detail_from_chapter": "From chapter",
|
|
"book_detail_to_chapter": "To chapter (optional)",
|
|
"book_detail_range_queuing": "Queuing\u2026",
|
|
"book_detail_scrape_range": "Scrape range",
|
|
"book_detail_admin": "Admin",
|
|
"book_detail_scraping_progress": "Fetching the first 20 chapters. This page will refresh automatically.",
|
|
"book_detail_scraping_home": "\u2190 Home",
|
|
"book_detail_rescrape_book": "Rescrape book",
|
|
"book_detail_less": "Less",
|
|
"book_detail_more": "More",
|
|
|
|
"chapters_search_placeholder": "Search chapters\u2026",
|
|
"chapters_jump_to": "Jump to Ch.{n}",
|
|
"chapters_no_match": "No chapters match \"{q}\"",
|
|
"chapters_none_available": "No chapters available yet.",
|
|
"chapters_reading_indicator": "reading",
|
|
"chapters_result_count": "{n} results",
|
|
|
|
"reader_fetching_chapter": "Fetching chapter\u2026",
|
|
"reader_words": "{n} words",
|
|
"reader_preview_audio_notice": "Preview chapter \u2014 audio not available for books outside the library.",
|
|
|
|
"profile_click_to_change": "Click avatar to change photo",
|
|
"profile_tts_voice": "TTS voice",
|
|
"profile_auto_advance": "Auto-advance to next chapter",
|
|
"profile_saving": "Saving\u2026",
|
|
"profile_saved": "Saved!",
|
|
"profile_session_this": "This session",
|
|
"profile_session_signed_in": "Signed in {date}",
|
|
"profile_session_last_seen": "\u00b7 Last seen {date}",
|
|
"profile_session_sign_out": "Sign out",
|
|
"profile_session_end": "End",
|
|
"profile_session_unrecognised": "These are all devices currently signed into your account. End any session you don\u2019t recognise.",
|
|
"profile_no_sessions": "No session records found. Sessions are tracked from the next login.",
|
|
"profile_change_password_heading": "Change password",
|
|
"profile_update_password": "Update password",
|
|
"profile_updating": "Updating\u2026",
|
|
"profile_password_changed_ok": "Password changed successfully.",
|
|
"profile_playback_speed": "Playback speed \u2014 {speed}x",
|
|
|
|
"profile_subscription_heading": "Subscription",
|
|
"profile_plan_pro": "Pro",
|
|
"profile_plan_free": "Free",
|
|
"profile_pro_active": "Your Pro subscription is active.",
|
|
"profile_pro_perks": "Unlimited audio, all translation languages, and voice selection are enabled.",
|
|
"profile_manage_subscription": "Manage subscription",
|
|
"profile_upgrade_heading": "Upgrade to Pro",
|
|
"profile_upgrade_desc": "Unlock unlimited audio, translations in 4 languages, and voice selection.",
|
|
"profile_upgrade_monthly": "Monthly \u2014 $6 / mo",
|
|
"profile_upgrade_annual": "Annual \u2014 $48 / yr",
|
|
"profile_free_limits": "Free plan: 3 audio chapters per day, English reading only.",
|
|
|
|
"user_currently_reading": "Currently Reading",
|
|
"user_library_count": "Library ({n})",
|
|
"user_joined": "Joined {date}",
|
|
"user_followers_label": "followers",
|
|
"user_following_label": "following",
|
|
"user_no_books": "No books in library yet.",
|
|
|
|
"admin_pages_label": "Pages",
|
|
"admin_tools_label": "Tools",
|
|
|
|
"admin_scrape_status_idle": "Idle",
|
|
"admin_scrape_status_running": "Running",
|
|
"admin_scrape_full_catalogue": "Full catalogue",
|
|
"admin_scrape_single_book": "Single book",
|
|
"admin_scrape_quick_genres": "Quick genres",
|
|
"admin_scrape_task_history": "Task history",
|
|
"admin_scrape_filter_placeholder": "Filter by kind, status or URL\u2026",
|
|
"admin_scrape_no_matching": "No matching tasks.",
|
|
"admin_scrape_start": "Start scrape",
|
|
"admin_scrape_queuing": "Queuing\u2026",
|
|
"admin_scrape_running": "Running\u2026",
|
|
|
|
"admin_audio_filter_jobs": "Filter by slug, voice or status\u2026",
|
|
"admin_audio_filter_cache": "Filter by slug, chapter or voice\u2026",
|
|
"admin_audio_no_matching_jobs": "No matching jobs.",
|
|
"admin_audio_no_jobs": "No audio jobs yet.",
|
|
"admin_audio_cache_empty": "Audio cache is empty.",
|
|
"admin_audio_no_cache_results": "No results.",
|
|
|
|
"admin_changelog_gitea": "Gitea releases",
|
|
"admin_changelog_no_releases": "No releases found.",
|
|
"admin_changelog_load_error": "Could not load releases: {error}",
|
|
|
|
"comments_top": "Top",
|
|
"comments_new": "New",
|
|
"comments_posting": "Posting\u2026",
|
|
"comments_login_link": "Log in",
|
|
"comments_login_suffix": "to leave a comment.",
|
|
"comments_anonymous": "Anonymous",
|
|
|
|
"reader_audio_narration": "Audio Narration",
|
|
"reader_playing": "Playing \u2014 controls below",
|
|
"reader_paused": "Paused \u2014 controls below",
|
|
"reader_ch_ready": "Ch.{n} ready",
|
|
"reader_ch_preparing": "Preparing Ch.{n}\u2026 {percent}%",
|
|
"reader_ch_generate_on_nav": "Ch.{n} will generate on navigate",
|
|
"reader_now_playing": "Now playing: {title}",
|
|
"reader_load_this_chapter": "Load this chapter",
|
|
"reader_generate_samples": "Generate missing samples",
|
|
"reader_voice_applies_next": "New voice applies on next \u201cPlay narration\u201d.",
|
|
"reader_choose_voice": "Choose Voice",
|
|
"reader_generating_narration": "Generating narration\u2026",
|
|
|
|
"profile_font_family": "Font Family",
|
|
"profile_font_system": "System",
|
|
"profile_font_serif": "Serif",
|
|
"profile_font_mono": "Monospace",
|
|
"profile_text_size": "Text Size",
|
|
"profile_text_size_sm": "Small",
|
|
"profile_text_size_md": "Normal",
|
|
"profile_text_size_lg": "Large",
|
|
"profile_text_size_xl": "X-Large"
|
|
}
|