Files
Suwayomi-Server/server/i18n/src/commonMain/moko-resources/values/base/strings.xml
Zeedif 8ae451ece5 refactor(opds): align feed generation with RFC5005 and OpenSearch specs (#1611)
* refactor(opds): align feed generation with RFC5005 and OpenSearch specs

This commit refactors the OPDS feed generation to strictly adhere to official specifications for search and pagination.

Previously, OpenSearch response elements (totalResults, itemsPerPage, startIndex) were incorrectly included in all acquisition feeds. According to the OPDS 1.2 and OpenSearch 1.1 specifications, these elements should only be present in feeds that are a direct response to a search query. This change restricts their inclusion to search result feeds only, ensuring spec compliance.

Additionally, pagination link relations were not fully implemented as per RFC 5005. This commit enhances all paginated feeds to include `first` and `last` links, in addition to the existing `prev` and `next` links. This provides a complete and standard-compliant navigation experience for OPDS clients.

- `FeedBuilderInternal` now accepts an `isSearchFeed` flag to conditionally add OpenSearch elements.
- All feed generation methods in `OpdsFeedBuilder` and `OpdsV1Controller` now correctly identify search contexts.
- RFC 5005 pagination links (`first`, `last`, `prev`, `next`) are now generated for all paginated feeds.
- Added necessary link relation constants to `OpdsConstants`.

* feat(opds): improve pagination navigation and code organization
2025-08-24 12:35:47 -04:00

157 lines
9.4 KiB
XML

<?xml version="1.0" encoding="UTF-8" ?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- OPDS feed titles and descriptions -->
<string name="opds_feeds_root">Suwayomi OPDS Catalog</string>
<string name="opds_feeds_manga_chapters">%1$s Chapters</string>
<string name="opds_feeds_chapter_details">%1$s | %2$s | Details</string>
<string name="opds_feeds_explore_title">Explore</string>
<string name="opds_feeds_explore_entry_content">Explore new series from your sources</string>
<string name="opds_feeds_history_title">History</string>
<string name="opds_feeds_history_entry_content">Recently read chapters</string>
<string name="opds_feeds_all_series_in_library_title">All Series</string>
<string name="opds_feeds_all_series_in_library_entry_content">Browse all series saved in your library</string>
<string name="opds_feeds_library_sources_title">Sources</string>
<string name="opds_feeds_library_sources_entry_content">Browse series in your library filtered by source</string>
<string name="opds_feeds_categories_title">Categories</string>
<string name="opds_feeds_categories_entry_content">Browse series organized by categories</string>
<string name="opds_feeds_genres_title">Genres</string>
<string name="opds_feeds_genres_entry_content">Browse series by genre tags</string>
<string name="opds_feeds_status_title">Status</string>
<string name="opds_feeds_status_entry_content">Browse series by publication status</string>
<string name="opds_feeds_languages_title">Languages</string>
<string name="opds_feeds_languages_entry_content">Browse series by content language</string>
<string name="opds_feeds_library_updates_title">Library Update History</string>
<string name="opds_feeds_library_updates_entry_content">Recently updated chapters from your library</string>
<string name="opds_feeds_search_results_title">Search Results</string>
<string name="opds_feeds_sources_title">All Sources</string>
<string name="opds_feeds_category_specific_title">Category: %1$s</string>
<string name="opds_feeds_genre_specific_title">Genre: %1$s</string>
<string name="opds_feeds_status_specific_title">Status: %1$s</string>
<string name="opds_feeds_language_specific_title">Language: %1$s</string>
<string name="opds_feeds_source_specific_title">Source: %1$s</string>
<string name="opds_feeds_library_source_specific_title">Library - Source: %1$s</string>
<string name="opds_feeds_source_specific_popular_title">Source: %1$s - Popular</string>
<string name="opds_feeds_source_specific_latest_title">Source: %1$s - Latest</string>
<!-- OPDS search texts -->
<string name="opds_search_shortname">Suwayomi OPDS Search</string>
<string name="opds_search_description">Search for series in the catalog.</string>
<!-- OPDS errors -->
<string name="opds_error_manga_not_found">Series with ID %1$d not found.</string>
<string name="opds_error_chapter_not_found">Chapter with index %1$d not found.</string>
<!-- OPDS facets (Filters and Sorting) -->
<string name="opds_facetgroup_sort_order">Sort Order</string>
<string name="opds_facetgroup_filter_read_status">Filter by Read Status</string>
<string name="opds_facetgroup_filter_content">Filter Content</string>
<string name="opds_facetgroup_filter_source">Filter by Source</string>
<string name="opds_facetgroup_filter_category">Filter by Category</string>
<string name="opds_facetgroup_filter_status">Filter by Status</string>
<string name="opds_facetgroup_filter_language">Filter by Language</string>
<string name="opds_facetgroup_filter_genre">Filter by Genre</string>
<string name="opds_facet_sort_oldest_first">Oldest First</string>
<string name="opds_facet_sort_newest_first">Newest First</string>
<string name="opds_facet_sort_date_asc">Date ascending</string>
<string name="opds_facet_sort_date_desc">Date descending</string>
<string name="opds_facet_sort_popular">Popular</string>
<string name="opds_facet_sort_latest">Latest</string>
<string name="opds_facet_sort_alpha_asc">Alphabetical A-Z</string>
<string name="opds_facet_sort_alpha_desc">Alphabetical Z-A</string>
<string name="opds_facet_sort_last_read_desc">Last Read</string>
<string name="opds_facet_sort_latest_chapter_desc">Latest Chapter</string>
<string name="opds_facet_sort_date_added_desc">Date Added</string>
<string name="opds_facet_sort_unread_desc">Unread chapters</string>
<string name="opds_facet_filter_all">All</string>
<string name="opds_facet_filter_all_chapters">All Chapters</string>
<string name="opds_facet_filter_unread_only">Unread</string>
<string name="opds_facet_filter_read_only">Read</string>
<string name="opds_facet_filter_downloaded">Downloaded</string>
<string name="opds_facet_filter_ongoing">Ongoing</string>
<string name="opds_facet_filter_completed">Completed</string>
<string name="opds_facet_all_sources">All Sources</string>
<string name="opds_facet_all_categories">All Categories</string>
<string name="opds_facet_all_statuses">All Statuses</string>
<string name="opds_facet_all_languages">All Languages</string>
<string name="opds_facet_all_genres">All Genres</string>
<!-- OPDS link texts -->
<string name="opds_linktitle_catalog_root">Catalog Root</string>
<string name="opds_linktitle_search_catalog">Search Catalog</string>
<string name="opds_linktitle_first_page">First Page</string>
<string name="opds_linktitle_previous_page">Previous Page</string>
<string name="opds_linktitle_next_page">Next Page</string>
<string name="opds_linktitle_last_page">Last Page</string>
<string name="opds_linktitle_self_feed">Current Feed</string>
<string name="opds_linktitle_view_on_web">View on Web</string>
<string name="opds_linktitle_stream_pages_start">Read Online</string>
<string name="opds_linktitle_stream_pages_continue">Continue Reading Online</string>
<string name="opds_linktitle_stream_pages_start_local">Read Online (Local Progress)</string>
<string name="opds_linktitle_stream_pages_continue_local">Continue Reading Online (Local Progress)</string>
<string name="opds_linktitle_stream_pages_start_remote">Read Online (Synced from %1$s)</string>
<string name="opds_linktitle_stream_pages_continue_remote">Continue Reading Online (Synced from %1$s)</string>
<string name="opds_linktitle_download_cbz">Download CBZ</string>
<string name="opds_linktitle_chapter_cover">Chapter Cover</string>
<string name="opds_linktitle_view_chapter_details">View Chapter Details &amp; Get Pages</string>
<!-- OPDS summary and details -->
<string name="opds_chapter_status_read"></string>
<string name="opds_chapter_status_in_progress"></string>
<string name="opds_chapter_status_unread"></string>
<string name="opds_chapter_status_downloaded">⬇️ </string>
<string name="opds_chapter_status_synced">🌐 </string>
<string name="opds_chapter_details_base">Series: %1$s | %2$s</string>
<string name="opds_chapter_details_scanlator"> | By %1$s</string>
<string name="opds_chapter_details_progress"> | Progress: %1$d of %2$d</string>
<string name="opds_manga_summary_status">Status: %1$s</string>
<string name="opds_manga_summary_source">Source: %1$s</string>
<string name="opds_manga_summary_language">Language: %1$s</string>
<!-- Serie status labels -->
<string name="manga_status_ongoing">Ongoing</string>
<string name="manga_status_completed">Completed</string>
<string name="manga_status_licensed">Licensed</string>
<string name="manga_status_publishing_finished">Publishing Finished</string>
<string name="manga_status_cancelled">Cancelled</string>
<string name="manga_status_on_hiatus">On Hiatus</string>
<string name="manga_status_unknown">Unknown</string>
<string name="label_error">Error</string>
<string name="label_version">Version <xliff:g id="version" example="v2.0.1833">%1$s</xliff:g></string>
<string name="label_close">Close</string>
<string name="webview_label_title">Suwayomi WebView</string>
<string name="webview_label_disconnected">Disconnected, please refresh</string>
<string name="webview_label_reversescroll">Reverse Scrolling</string>
<string name="webview_label_bindingshint">Note: While focus is on the WebView part, no keybinds, including refresh, will be handled by the browser.</string>
<string name="webview_label_init">Initializing... Please wait</string>
<string name="webview_label_getstarted">Enter a URL to get started</string>
<string name="webview_label_loading">Loading page...</string>
<string name="webview_label_copy">Copy to Clipboard</string>
<string name="webview_label_copy_description">Automatic clipboard copy failed, please use the input below to manually copy the value.</string>
<string name="webview_label_login_required">Your configuration requires you to login. Please enter username and password.</string>
<string name="webview_placeholder_url">Enter URL...</string>
<string name="login_label_title">Suwayomi Login</string>
<string name="login_label_username">Username</string>
<string name="login_label_password">Password</string>
<string name="login_label_login">Log In</string>
<string name="login_placeholder_username">Type username...</string>
<string name="login_placeholder_password">Secret...</string>
</resources>