Refine store copy and empty states

This commit is contained in:
tapframe 2026-07-12 02:14:35 +05:30
parent 8b4715e945
commit d9954c04e8
43 changed files with 616 additions and 315 deletions

View file

@ -4,7 +4,7 @@ actual object AppFeaturePolicy {
actual val pluginsEnabled: Boolean = true
actual val supportersContributorsPageEnabled: Boolean = true
actual val accountDeletionEnabled: Boolean = false
actual val personalMediaAddonCopyEnabled: Boolean = false
actual val storeNarrativeEnabled: Boolean = false
actual val p2pEnabled: Boolean = true
actual val trailerPlaybackMode: TrailerPlaybackMode = TrailerPlaybackMode.IN_APP
actual val heroTrailerPlaybackSupported: Boolean = true

View file

@ -4,7 +4,7 @@ actual object AppFeaturePolicy {
actual val pluginsEnabled: Boolean = false
actual val supportersContributorsPageEnabled: Boolean = true
actual val accountDeletionEnabled: Boolean = false
actual val personalMediaAddonCopyEnabled: Boolean = false
actual val storeNarrativeEnabled: Boolean = true
actual val p2pEnabled: Boolean = true
actual val trailerPlaybackMode: TrailerPlaybackMode = TrailerPlaybackMode.EXTERNAL
actual val heroTrailerPlaybackSupported: Boolean = false

View file

@ -433,7 +433,9 @@
<string name="compose_settings_root_check_updates_description">Изтегли последна версия</string>
<string name="compose_settings_root_check_updates_title">Провери за актуализации</string>
<string name="compose_settings_root_content_discovery_description">Управлявай добавки и източници за discovery.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Управлявайте добавките и изберете какво да се показва в Nuvio.</string>
<string name="compose_settings_root_downloads_description">Управлявай изтеглените филми и епизоди.</string>
<string name="compose_settings_root_downloads_description_appstore">Управлявайте запазеното на това устройство.</string>
<string name="compose_settings_root_downloads_title">Изтегляния</string>
<string name="compose_settings_root_general_section">ОБЩИ</string>
<string name="compose_settings_root_integrations_description">Управлявай наличните интеграции</string>
@ -1845,11 +1847,13 @@
<string name="player_error_torrent">Грешка в торента: %1$s</string>
<!-- Current cmp-rewrite string additions -->
<string name="action_switch">Превключи</string>
<string name="addons_appstore_add_description">Свържете собствен медиен сървър, за да разглеждате и възпроизвеждате от личната си библиотека.</string>
<string name="addons_appstore_empty_subtitle">Добавете URL на сървър по-горе, когато искате Nuvio да показва вашата лична библиотека.</string>
<string name="addons_appstore_empty_title">Няма свързани лични библиотеки.</string>
<string name="addons_appstore_input_placeholder">URL на сървър</string>
<string name="addons_appstore_install_button">Добави</string>
<string name="addons_appstore_add_description">Пренесете библиотеката си в Nuvio с добавките, които използвате.</string>
<string name="addons_appstore_empty_subtitle">Добавете добавка, за да започнете да изграждате библиотеката си.</string>
<string name="addons_appstore_empty_title">Настройте Nuvio по свой начин.</string>
<string name="addons_appstore_input_placeholder">URL на добавка</string>
<string name="addons_appstore_install_button">Добавяне на добавка</string>
<string name="store_empty_unavailable_title">Все още няма нищо тук</string>
<string name="store_empty_unavailable_message">Текущите ви добавки все още нямат какво да покажат тук.</string>
<string name="community_donation_progress_title">Сървър и поддръжка за този месец</string>
<string name="community_donation_progress_complete">Покрито. Допълнителната подкрепа вече отива за разработка.</string>
<string name="community_donation_progress_remaining">След 100% допълнителната подкрепа отива за разработка.</string>
@ -1861,7 +1865,7 @@
<string name="details_actions_menu_label">Още действия</string>
<string name="p2p_error_unknown">Неизвестна грешка в торента</string>
<string name="settings_appearance_app_language_device">Език на устройството</string>
<string name="settings_content_discovery_addons_description_appstore">Свържете лични медийни източници и управлявайте достъпа до собствената си библиотека.</string>
<string name="settings_content_discovery_addons_description_appstore">Добавяйте и управлявайте добавките, които използвате с Nuvio.</string>
<string name="settings_playback_external_player_send_skip_segments">Изпращане на времеви маркери за интро и аутро</string>
<string name="settings_playback_external_player_send_skip_segments_description">Предайте откритите времеви маркери за интро и аутро към външния плейър за автоматично прескачане. Работи само в плейъри, които го поддържат; останалите плейъри го игнорират.</string>
<string name="settings_playback_touch_gestures">Жестове с докосване</string>

View file

@ -32,11 +32,13 @@
<string name="addons_badge_unavailable">Nedostupné</string>
<string name="addons_configure">Konfigurovat doplněk</string>
<string name="addons_delete">Smazat doplněk</string>
<string name="addons_appstore_add_description">Připojte svůj vlastní mediální server a procházejte i přehrávejte ze své osobní knihovny.</string>
<string name="addons_appstore_empty_subtitle">Přidejte výše adresu URL serveru, pokud chcete, aby Nuvio zobrazovalo vaši soukromou knihovnu.</string>
<string name="addons_appstore_empty_title">Nejsou připojeny žádné osobní knihovny.</string>
<string name="addons_appstore_input_placeholder">URL serveru</string>
<string name="addons_appstore_install_button">Přidat</string>
<string name="addons_appstore_add_description">Přeneste svou knihovnu do Nuvia pomocí doplňků, které používáte.</string>
<string name="addons_appstore_empty_subtitle">Přidejte doplněk a začněte vytvářet svou knihovnu.</string>
<string name="addons_appstore_empty_title">Přizpůsobte si Nuvio.</string>
<string name="addons_appstore_input_placeholder">URL doplňku</string>
<string name="addons_appstore_install_button">Přidat doplněk</string>
<string name="store_empty_unavailable_title">Zatím tu nic není</string>
<string name="store_empty_unavailable_message">Vaše současné doplňky tu zatím nemají co zobrazit.</string>
<string name="addons_empty_subtitle">Přidejte URL manifestu, abyste mohli do Nuvio začít načítat katalogy, metadata, streamy nebo titulky.</string>
<string name="addons_empty_title">Zatím nejsou nainstalovány žádné doplňky.</string>
<string name="addons_error_enter_url">Zadejte URL doplňku.</string>
@ -442,7 +444,9 @@
<string name="compose_settings_root_check_updates_description">Stáhnout nejnovější verzi</string>
<string name="compose_settings_root_check_updates_title">Zkontrolovat aktualizace</string>
<string name="compose_settings_root_content_discovery_description">Správa doplňků a zdrojů objevování.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Spravujte doplňky a vyberte, co se má v Nuviu zobrazovat.</string>
<string name="compose_settings_root_downloads_description">Spravujte své stažené filmy a epizody.</string>
<string name="compose_settings_root_downloads_description_appstore">Spravujte obsah uložený v tomto zařízení.</string>
<string name="compose_settings_root_downloads_title">Stažené položky</string>
<string name="compose_settings_root_general_section">OBECNÉ</string>
<string name="compose_settings_root_integrations_description">Spravovat dostupné integrace</string>
@ -638,7 +642,7 @@
<string name="settings_content_discovery_section_home">DOMŮ</string>
<string name="settings_content_discovery_section_sources">ZDROJE</string>
<string name="settings_content_discovery_addons_description">Instalovat, odstraňovat, obnovovat a třídit vaše zdroje obsahu.</string>
<string name="settings_content_discovery_addons_description_appstore">Připojit osobní mediální zdroje a spravovat přístup k vlastní knihovně.</string>
<string name="settings_content_discovery_addons_description_appstore">Přidávejte a spravujte doplňky, které používáte s Nuviem.</string>
<string name="settings_content_discovery_plugins_description">Instalovat repozitáře pro JavaScriptové scarpování a testovat poskytovatele interně.</string>
<string name="settings_content_discovery_homescreen_description">Upravit rozvržení domovské obrazovky, viditelnost obsahu a chování plakátů.</string>
<string name="settings_content_discovery_meta_screen_description">Nastavení pro obrazovku detailu a epizody.</string>

View file

@ -27,6 +27,13 @@
<string name="addons_badge_unavailable">Nicht verfügbar</string>
<string name="addons_configure">Addon konfigurieren</string>
<string name="addons_delete">Addon löschen</string>
<string name="addons_appstore_add_description">Bring deine Mediathek mit den Addons, die du nutzt, zu Nuvio.</string>
<string name="addons_appstore_empty_subtitle">Füge ein Addon hinzu, um deine Mediathek aufzubauen.</string>
<string name="addons_appstore_empty_title">Richte Nuvio für dich ein.</string>
<string name="addons_appstore_input_placeholder">Addon-URL</string>
<string name="addons_appstore_install_button">Addon hinzufügen</string>
<string name="store_empty_unavailable_title">Hier gibt es noch nichts</string>
<string name="store_empty_unavailable_message">Deine aktuellen Addons zeigen hier noch nichts an.</string>
<string name="addons_empty_subtitle">Füge eine Manifest-URL hinzu, um Kataloge, Metadaten, Streams oder Untertitel in Nuvio zu laden.</string>
<string name="addons_empty_title">Noch keine Addons installiert.</string>
<string name="addons_error_enter_url">Gib eine Addon-URL ein.</string>
@ -383,7 +390,9 @@
<string name="compose_settings_root_check_updates_description">Suche nach neuen Versionen der App.</string>
<string name="compose_settings_root_check_updates_title">Nach Updates suchen</string>
<string name="compose_settings_root_content_discovery_description">Verwalte Addons und Entdeckungsquellen.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Verwalte Addons und wähle aus, was in Nuvio angezeigt wird.</string>
<string name="compose_settings_root_downloads_description">Verwalte deine heruntergeladenen Filme und Episoden.</string>
<string name="compose_settings_root_downloads_description_appstore">Verwalte, was du auf diesem Gerät gespeichert hast.</string>
<string name="compose_settings_root_downloads_title">Downloads</string>
<string name="compose_settings_root_general_section">ALLGEMEIN</string>
<string name="compose_settings_root_integrations_description">TMDB- und MDBList-Dienste verbinden.</string>
@ -519,6 +528,7 @@
<string name="settings_content_discovery_section_home">START</string>
<string name="settings_content_discovery_section_sources">QUELLEN</string>
<string name="settings_content_discovery_addons_description">Installiere, entferne, aktualisiere und sortiere deine Inhaltsquellen.</string>
<string name="settings_content_discovery_addons_description_appstore">Füge die Addons hinzu, die du mit Nuvio nutzt, und verwalte sie.</string>
<string name="settings_content_discovery_plugins_description">Installiere JavaScript-Scraper-Repositories und teste Anbieter intern.</string>
<string name="settings_content_discovery_homescreen_description">Lege fest, welche Kataloge auf der Startseite und in welcher Reihenfolge erscheinen.</string>
<string name="settings_content_discovery_meta_screen_description">Detail-Abschnitte deaktivieren und alles unterhalb des Hero neu anordnen.</string>

View file

@ -233,7 +233,9 @@
<string name="compose_settings_root_check_updates_description">Ελέγξτε για νέες εκδόσεις της εφαρμογής.</string>
<string name="compose_settings_root_check_updates_title">Έλεγχος για ενημερώσεις</string>
<string name="compose_settings_root_content_discovery_description">Διαχείριση πρόσθετων και πηγών ανακάλυψης.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Διαχειριστείτε τα πρόσθετα και επιλέξτε τι εμφανίζεται στο Nuvio.</string>
<string name="compose_settings_root_downloads_description">Διαχειριστείτε τις κατεβασμένες ταινίες και επεισόδιά σας.</string>
<string name="compose_settings_root_downloads_description_appstore">Διαχειριστείτε όσα έχετε αποθηκεύσει σε αυτή τη συσκευή.</string>
<string name="compose_settings_root_downloads_title">Λήψεις</string>
<string name="compose_settings_root_general_section">ΓΕΝΙΚΑ</string>
<string name="compose_settings_root_integrations_description">Σύνδεση υπηρεσιών TMDB και MDBList.</string>
@ -1061,11 +1063,13 @@
<string name="action_saving">Αποθήκευση…</string>
<string name="action_switch">Εναλλαγή</string>
<string name="action_validate">Επικύρωση</string>
<string name="addons_appstore_add_description">Συνδέστε τον δικό σας διακομιστή μέσων για να περιηγηθείτε και να αναπαραγάγετε από τη δική σας προσωπική βιβλιοθήκη.</string>
<string name="addons_appstore_empty_subtitle">Προσθέστε μια διεύθυνση URL διακομιστή παραπάνω όταν θέλετε το Nuvio να εμφανίζει τη δική σας ιδιωτική βιβλιοθήκη.</string>
<string name="addons_appstore_empty_title">Δεν υπάρχουν προσωπικές βιβλιοθήκες συνδεδεμένες.</string>
<string name="addons_appstore_input_placeholder">Διεύθυνση URL διακομιστή</string>
<string name="addons_appstore_install_button">Προσθήκη</string>
<string name="addons_appstore_add_description">Φέρτε τη βιβλιοθήκη σας στο Nuvio με τα πρόσθετα που χρησιμοποιείτε.</string>
<string name="addons_appstore_empty_subtitle">Προσθέστε ένα πρόσθετο για να αρχίσετε να δημιουργείτε τη βιβλιοθήκη σας.</string>
<string name="addons_appstore_empty_title">Κάντε το Nuvio δικό σας.</string>
<string name="addons_appstore_input_placeholder">URL πρόσθετου</string>
<string name="addons_appstore_install_button">Προσθήκη πρόσθετου</string>
<string name="store_empty_unavailable_title">Δεν υπάρχει τίποτα εδώ ακόμη</string>
<string name="store_empty_unavailable_message">Τα πρόσθετα που χρησιμοποιείτε δεν έχουν ακόμη τίποτα να εμφανίσουν εδώ.</string>
<string name="addons_badge_disabled">Απενεργοποιημένο</string>
<string name="addons_manifest_missing_field">Το manifest είναι κενό "%1$s"</string>
<string name="cloud_library_connect_action">Σύνδεση λογαριασμού</string>
@ -1520,7 +1524,7 @@
<string name="settings_appearance_app_language_device">Device Γλώσσα</string>
<string name="settings_appearance_liquid_glass">Liquid Glass</string>
<string name="settings_appearance_liquid_glass_description">Use the native iPhone tab bar on iOS 26 and later.</string>
<string name="settings_content_discovery_addons_description_appstore">Connect personal media sources and manage access to your own Βιβλιοθήκη.</string>
<string name="settings_content_discovery_addons_description_appstore">Προσθέστε και διαχειριστείτε τα πρόσθετα που χρησιμοποιείτε με το Nuvio.</string>
<string name="settings_continue_watching_blur_next_up_description">Blur next episode thumbnails in Συνέχεια Watching to avoid spoilers.</string>
<string name="settings_continue_watching_blur_next_up_title">Blur Unwatched in Συνέχεια Watching</string>
<string name="settings_continue_watching_section_sort_order">Ταξινόμηση ORDER</string>

View file

@ -32,11 +32,13 @@
<string name="addons_badge_unavailable">No disponible</string>
<string name="addons_configure">Configurar complemento</string>
<string name="addons_delete">Eliminar complemento</string>
<string name="addons_appstore_add_description">Conecte su propio servidor multimedia para navegar y reproducir desde su biblioteca personal.</string>
<string name="addons_appstore_empty_subtitle">Agregue una URL de servidor arriba cuando desee que Nuvio muestre su biblioteca privada.</string>
<string name="addons_appstore_empty_title">No hay bibliotecas personales conectadas.</string>
<string name="addons_appstore_input_placeholder">URL del servidor</string>
<string name="addons_appstore_install_button">Agregar</string>
<string name="addons_appstore_add_description">Lleva tu biblioteca a Nuvio con los complementos que utilizas.</string>
<string name="addons_appstore_empty_subtitle">Agrega un complemento para empezar a crear tu biblioteca.</string>
<string name="addons_appstore_empty_title">Haz tuyo Nuvio.</string>
<string name="addons_appstore_input_placeholder">URL del complemento</string>
<string name="addons_appstore_install_button">Agregar complemento</string>
<string name="store_empty_unavailable_title">Aún no hay nada aquí</string>
<string name="store_empty_unavailable_message">Tus complementos actuales aún no tienen nada que mostrar aquí.</string>
<string name="addons_empty_subtitle">Agrega una URL de manifiesto para empezar a cargar catálogos, metadatos, streams o subtítulos en Nuvio.</string>
<string name="addons_empty_title">Aún no hay complementos instalados.</string>
<string name="addons_error_enter_url">Introduce una URL de complemento.</string>
@ -442,7 +444,9 @@
<string name="compose_settings_root_check_updates_description">Buscar nuevas versiones de la app.</string>
<string name="compose_settings_root_check_updates_title">Buscar actualizaciones</string>
<string name="compose_settings_root_content_discovery_description">Administra complementos y fuentes de descubrimiento.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Administra tus complementos y elige qué aparece en Nuvio.</string>
<string name="compose_settings_root_downloads_description">Administra tus películas y episodios descargados.</string>
<string name="compose_settings_root_downloads_description_appstore">Administra lo que has guardado en este dispositivo.</string>
<string name="compose_settings_root_downloads_title">Descargas</string>
<string name="compose_settings_root_general_section">GENERAL</string>
<string name="compose_settings_root_integrations_description">Conecta los servicios TMDB y MDBList.</string>
@ -638,7 +642,7 @@
<string name="settings_content_discovery_section_home">INICIO</string>
<string name="settings_content_discovery_section_sources">FUENTES</string>
<string name="settings_content_discovery_addons_description">Instala, elimina, actualiza y ordena tus fuentes de contenido.</string>
<string name="settings_content_discovery_addons_description_appstore">Conecte fuentes de medios personales y administre el acceso a su propia biblioteca.</string>
<string name="settings_content_discovery_addons_description_appstore">Agrega y administra los complementos que utilizas con Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Instala repositorios de scrapers en JavaScript y prueba proveedores internamente.</string>
<string name="settings_content_discovery_homescreen_description">Controla qué catálogos aparecen en Inicio y en qué orden.</string>
<string name="settings_content_discovery_meta_screen_description">Desactiva secciones de detalles y reordena todo debajo del Destacado.</string>

View file

@ -33,11 +33,13 @@
<string name="addons_badge_unavailable">Indisponible</string>
<string name="addons_configure">Configurer laddon</string>
<string name="addons_delete">Supprimer laddon</string>
<string name="addons_appstore_add_description">Connectez votre propre serveur multimédia pour parcourir et lire depuis votre bibliothèque personnelle.</string>
<string name="addons_appstore_empty_subtitle">Ajoutez une URL de serveur ci-dessus pour que Nuvio affiche votre bibliothèque privée.</string>
<string name="addons_appstore_empty_title">Aucune bibliothèque personnelle connectée.</string>
<string name="addons_appstore_input_placeholder">URL du serveur</string>
<string name="addons_appstore_install_button">Ajouter</string>
<string name="addons_appstore_add_description">Retrouvez votre bibliothèque dans Nuvio avec les addons que vous utilisez.</string>
<string name="addons_appstore_empty_subtitle">Ajoutez un addon pour commencer à créer votre bibliothèque.</string>
<string name="addons_appstore_empty_title">Personnalisez Nuvio.</string>
<string name="addons_appstore_input_placeholder">URL de laddon</string>
<string name="addons_appstore_install_button">Ajouter un addon</string>
<string name="store_empty_unavailable_title">Rien à afficher pour le moment</string>
<string name="store_empty_unavailable_message">Vos addons actuels nont encore rien à afficher ici.</string>
<string name="addons_empty_subtitle">Ajoutez une URL de manifeste pour commencer à charger des catalogues, métadonnées, streams ou sous-titres dans Nuvio.</string>
<string name="addons_empty_title">Aucun addon installé.</string>
<string name="addons_error_enter_url">Saisissez une URL daddon.</string>
@ -434,7 +436,9 @@
<string name="compose_settings_root_check_updates_description">Rechercher de nouvelles versions de lapplication.</string>
<string name="compose_settings_root_check_updates_title">Vérifier les mises à jour</string>
<string name="compose_settings_root_content_discovery_description">Gérez les addons et sources de découverte.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Gérez vos addons et choisissez ce qui apparaît dans Nuvio.</string>
<string name="compose_settings_root_downloads_description">Gérez vos films et épisodes téléchargés.</string>
<string name="compose_settings_root_downloads_description_appstore">Gérez ce que vous avez enregistré sur cet appareil.</string>
<string name="compose_settings_root_downloads_title">Téléchargements</string>
<string name="compose_settings_root_general_section">GÉNÉRAL</string>
<string name="compose_settings_root_integrations_description">Connectez les services TMDB et MDBList.</string>
@ -648,7 +652,7 @@
<string name="settings_content_discovery_section_home">ACCUEIL</string>
<string name="settings_content_discovery_section_sources">SOURCES</string>
<string name="settings_content_discovery_addons_description">Installez, supprimez, mettez à jour et ordonnez vos sources de contenu.</string>
<string name="settings_content_discovery_addons_description_appstore">Connectez des sources multimédias personnelles et gérez laccès à votre propre bibliothèque.</string>
<string name="settings_content_discovery_addons_description_appstore">Ajoutez et gérez les addons que vous utilisez avec Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Installez des dépôts de scrapers JavaScript et testez des fournisseurs en interne.</string>
<string name="settings_content_discovery_homescreen_description">Contrôle quels catalogues apparaissent à laccueil et dans quel ordre.</string>
<string name="settings_content_discovery_meta_screen_description">Désactivez des sections de détails et réorganisez tout sous le Hero.</string>

View file

@ -401,7 +401,9 @@
<string name="compose_settings_root_check_updates_description">A legújabb verzió letöltése</string>
<string name="compose_settings_root_check_updates_title">Frissítések keresése</string>
<string name="compose_settings_root_content_discovery_description">Kiegészítők és tartalomforrások kezelése</string>
<string name="compose_settings_root_content_discovery_description_appstore">Kezeld a kiegészítőket, és válaszd ki, mi jelenjen meg a Nuvióban.</string>
<string name="compose_settings_root_downloads_description">A letöltött filmek és epizódok kezelése</string>
<string name="compose_settings_root_downloads_description_appstore">Kezeld az eszközre mentett tartalmakat.</string>
<string name="compose_settings_root_downloads_title">Letöltések</string>
<string name="compose_settings_root_general_section">ÁLTALÁNOS</string>
<string name="compose_settings_root_integrations_description">Elérhető integrációk kezelése</string>
@ -1339,11 +1341,13 @@
<string name="unit_bytes_gb">GB</string>
<string name="action_switch">Váltás</string>
<string name="addons_badge_disabled">Kikapcsolva</string>
<string name="addons_appstore_add_description">Csatlakoztasd saját médiaszerveredet a személyes könyvtárad böngészéséhez és lejátszásához.</string>
<string name="addons_appstore_empty_subtitle">Adj meg egy szerver URL-t fent, ha szeretnéd, hogy a Nuvio megjelenítse a privát könyvtáradat.</string>
<string name="addons_appstore_empty_title">Nincsenek csatlakoztatott személyes könyvtárak.</string>
<string name="addons_appstore_input_placeholder">Szerver URL</string>
<string name="addons_appstore_install_button">Hozzáadás</string>
<string name="addons_appstore_add_description">Hozd el a könyvtáradat a Nuvióba a használt kiegészítőkkel.</string>
<string name="addons_appstore_empty_subtitle">Adj hozzá egy kiegészítőt a könyvtárad felépítéséhez.</string>
<string name="addons_appstore_empty_title">Szabd személyre a Nuviót.</string>
<string name="addons_appstore_input_placeholder">Kiegészítő URL-je</string>
<string name="addons_appstore_install_button">Kiegészítő hozzáadása</string>
<string name="store_empty_unavailable_title">Itt még nincs semmi</string>
<string name="store_empty_unavailable_message">A jelenlegi kiegészítőid még nem jelenítenek meg itt semmit.</string>
<string name="collections_editor_tmdb_genres_movie_placeholder">28,12</string>
<string name="collections_editor_tmdb_genres_series_placeholder">18,35</string>
<string name="collections_editor_tmdb_date_from_placeholder">2020-01-01</string>
@ -1397,7 +1401,7 @@
<string name="settings_show_secret">Érték megjelenítése</string>
<string name="settings_continue_watching_style_card">Kártya</string>
<string name="settings_continue_watching_style_card_description">TV-stílusú fekvő kártya</string>
<string name="settings_content_discovery_addons_description_appstore">Személyes médiaforrások csatlakoztatása és a saját könyvtáradhoz való hozzáférés kezelése.</string>
<string name="settings_content_discovery_addons_description_appstore">Add hozzá és kezeld a Nuvióval használt kiegészítőket.</string>
<string name="settings_debrid_cloud_library">Felhő könyvtár</string>
<string name="settings_debrid_cloud_library_description">A csatlakoztatott fiókjaidban már meglévő fájlok böngészése és lejátszása.</string>
<string name="settings_debrid_resolve_with">Feloldás ezzel</string>

View file

@ -31,6 +31,13 @@
<string name="addons_badge_unavailable">Tidak Tersedia</string>
<string name="addons_configure">Konfigurasi addon</string>
<string name="addons_delete">Hapus addon</string>
<string name="addons_appstore_add_description">Bawa pustaka Anda ke Nuvio dengan addon yang Anda gunakan.</string>
<string name="addons_appstore_empty_subtitle">Tambahkan addon untuk mulai membangun pustaka Anda.</string>
<string name="addons_appstore_empty_title">Jadikan Nuvio milik Anda.</string>
<string name="addons_appstore_input_placeholder">URL Addon</string>
<string name="addons_appstore_install_button">Tambah Addon</string>
<string name="store_empty_unavailable_title">Belum ada apa pun di sini</string>
<string name="store_empty_unavailable_message">Addon yang Anda gunakan belum memiliki apa pun untuk ditampilkan di sini.</string>
<string name="addons_empty_subtitle">Tambahkan URL manifes untuk mulai memuat katalog, metadata, streaming, atau subtitle ke Nuvio.</string>
<string name="addons_empty_title">Belum ada addon yang terpasang.</string>
<string name="addons_error_enter_url">Masukkan URL addon.</string>
@ -412,7 +419,9 @@
<string name="compose_settings_root_check_updates_description">Unduh versi terbaru</string>
<string name="compose_settings_root_check_updates_title">Periksa pembaruan</string>
<string name="compose_settings_root_content_discovery_description">Kelola addon dan sumber penemuan.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Kelola addon dan pilih apa yang tampil di Nuvio.</string>
<string name="compose_settings_root_downloads_description">Kelola film dan episode yang telah diunduh.</string>
<string name="compose_settings_root_downloads_description_appstore">Kelola yang Anda simpan di perangkat ini.</string>
<string name="compose_settings_root_downloads_title">Unduhan</string>
<string name="compose_settings_root_general_section">UMUM</string>
<string name="compose_settings_root_integrations_description">Kelola integrasi yang tersedia</string>
@ -597,6 +606,7 @@
<string name="settings_content_discovery_section_home">BERANDA</string>
<string name="settings_content_discovery_section_sources">SUMBER</string>
<string name="settings_content_discovery_addons_description">Pasang, hapus, perbarui, dan urutkan sumber konten Anda.</string>
<string name="settings_content_discovery_addons_description_appstore">Tambahkan dan kelola addon yang Anda gunakan dengan Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Pasang repositori scraper JavaScript dan uji penyedia secara internal.</string>
<string name="settings_content_discovery_homescreen_description">Sesuaikan tata letak beranda, visibilitas konten, dan poster</string>
<string name="settings_content_discovery_meta_screen_description">Pengaturan untuk layar detail dan episode.</string>

View file

@ -31,6 +31,13 @@
<string name="addons_badge_unavailable">Tidak Tersedia</string>
<string name="addons_configure">Konfigurasi addon</string>
<string name="addons_delete">Hapus addon</string>
<string name="addons_appstore_add_description">Bawa pustaka Anda ke Nuvio dengan addon yang Anda gunakan.</string>
<string name="addons_appstore_empty_subtitle">Tambahkan addon untuk mulai membangun pustaka Anda.</string>
<string name="addons_appstore_empty_title">Jadikan Nuvio milik Anda.</string>
<string name="addons_appstore_input_placeholder">URL Addon</string>
<string name="addons_appstore_install_button">Tambah Addon</string>
<string name="store_empty_unavailable_title">Belum ada apa pun di sini</string>
<string name="store_empty_unavailable_message">Addon yang Anda gunakan belum memiliki apa pun untuk ditampilkan di sini.</string>
<string name="addons_empty_subtitle">Tambahkan URL manifes untuk mulai memuat katalog, metadata, streaming, atau subtitle ke Nuvio.</string>
<string name="addons_empty_title">Belum ada addon yang terpasang.</string>
<string name="addons_error_enter_url">Masukkan URL addon.</string>
@ -412,7 +419,9 @@
<string name="compose_settings_root_check_updates_description">Unduh versi terbaru</string>
<string name="compose_settings_root_check_updates_title">Periksa pembaruan</string>
<string name="compose_settings_root_content_discovery_description">Kelola addon dan sumber penemuan.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Kelola addon dan pilih apa yang tampil di Nuvio.</string>
<string name="compose_settings_root_downloads_description">Kelola film dan episode yang telah diunduh.</string>
<string name="compose_settings_root_downloads_description_appstore">Kelola yang Anda simpan di perangkat ini.</string>
<string name="compose_settings_root_downloads_title">Unduhan</string>
<string name="compose_settings_root_general_section">UMUM</string>
<string name="compose_settings_root_integrations_description">Kelola integrasi yang tersedia</string>
@ -597,6 +606,7 @@
<string name="settings_content_discovery_section_home">BERANDA</string>
<string name="settings_content_discovery_section_sources">SUMBER</string>
<string name="settings_content_discovery_addons_description">Pasang, hapus, perbarui, dan urutkan sumber konten Anda.</string>
<string name="settings_content_discovery_addons_description_appstore">Tambahkan dan kelola addon yang Anda gunakan dengan Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Pasang repositori scraper JavaScript dan uji penyedia secara internal.</string>
<string name="settings_content_discovery_homescreen_description">Sesuaikan tata letak beranda, visibilitas konten, dan poster</string>
<string name="settings_content_discovery_meta_screen_description">Pengaturan untuk layar detail dan episode.</string>

View file

@ -27,6 +27,13 @@
<string name="addons_badge_unavailable">Non Disponibile</string>
<string name="addons_configure">Configura addon</string>
<string name="addons_delete">Cancella addon</string>
<string name="addons_appstore_add_description">Porta la tua libreria su Nuvio con gli addon che usi.</string>
<string name="addons_appstore_empty_subtitle">Aggiungi un addon per iniziare a creare la tua libreria.</string>
<string name="addons_appstore_empty_title">Fai tuo Nuvio.</string>
<string name="addons_appstore_input_placeholder">URL addon</string>
<string name="addons_appstore_install_button">Aggiungi addon</string>
<string name="store_empty_unavailable_title">Non cè ancora niente qui</string>
<string name="store_empty_unavailable_message">Gli addon che usi non hanno ancora nulla da mostrare qui.</string>
<string name="addons_empty_subtitle">Aggiungi un manifest URL per iniziare a caricare cataloghi , metadata, flussi o sottotitoli dentro Nuvio.</string>
<string name="addons_empty_title">Nessun addon installato ancora.</string>
<string name="addons_error_enter_url">Inserisci l'URL dell'addon.</string>
@ -245,7 +252,9 @@
<string name="compose_settings_root_check_updates_description">Controlla se ci sono nuove versioni dell'app.</string>
<string name="compose_settings_root_check_updates_title">Verifica aggiornamenti</string>
<string name="compose_settings_root_content_discovery_description">Gestisci gli addon e le sorgenti di scoperta.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Gestisci gli addon e scegli cosa mostrare in Nuvio.</string>
<string name="compose_settings_root_downloads_description">Gestisci i film e gli episodi scaricati.</string>
<string name="compose_settings_root_downloads_description_appstore">Gestisci ciò che hai salvato su questo dispositivo.</string>
<string name="compose_settings_root_downloads_title">Download</string>
<string name="compose_settings_root_general_section">GENERALI</string>
<string name="compose_settings_root_integrations_description">Collega i servizi TMDB e MDBList.</string>
@ -382,6 +391,7 @@
<string name="settings_content_discovery_section_home">HOME</string>
<string name="settings_content_discovery_section_sources">SORGENTI</string>
<string name="settings_content_discovery_addons_description">Installa, rimuovi, aggiorna e ordina le tue sorgenti di contenuto.</string>
<string name="settings_content_discovery_addons_description_appstore">Aggiungi e gestisci gli addon che usi con Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Installa repository di scraper JavaScript e testa i provider internamente.</string>
<string name="settings_content_discovery_homescreen_description">Controlla quali cataloghi appaiono in Home e in quale ordine.</string>
<string name="settings_content_discovery_meta_screen_description">Disabilita le sezioni dei dettagli e riordina tutto ciò che sta sotto l'elemento Hero.</string>

View file

@ -32,11 +32,13 @@
<string name="addons_badge_unavailable">利用不可</string>
<string name="addons_configure">アドオンを設定</string>
<string name="addons_delete">アドオンを削除</string>
<string name="addons_appstore_add_description">独自のメディアサーバーを接続して、個人ライブラリを参照・再生します。</string>
<string name="addons_appstore_empty_subtitle">Nuvioに個人ライブラリを表示させたい場合は、上にサーバーURLを追加してください。</string>
<string name="addons_appstore_empty_title">接続された個人ライブラリはありません。</string>
<string name="addons_appstore_input_placeholder">サーバーURL</string>
<string name="addons_appstore_install_button">追加</string>
<string name="addons_appstore_add_description">いつものアドオンで、ライブラリをNuvioにまとめましょう。</string>
<string name="addons_appstore_empty_subtitle">アドオンを追加して、ライブラリを作り始めましょう。</string>
<string name="addons_appstore_empty_title">Nuvioを自分好みに。</string>
<string name="addons_appstore_input_placeholder">アドオンURL</string>
<string name="addons_appstore_install_button">アドオンを追加</string>
<string name="store_empty_unavailable_title">まだ何もありません</string>
<string name="store_empty_unavailable_message">現在のアドオンには、ここに表示できるものがまだありません。</string>
<string name="addons_empty_subtitle">マニフェストURLを追加して、カタログ・メタデータ・ストリーム・字幕をNuvioに読み込みましょう。</string>
<string name="addons_empty_title">アドオンがありません</string>
<string name="addons_error_enter_url">アドオンのURLを入力してください。</string>
@ -442,7 +444,9 @@
<string name="compose_settings_root_check_updates_description">最新リリースをダウンロード</string>
<string name="compose_settings_root_check_updates_title">アップデートを確認</string>
<string name="compose_settings_root_content_discovery_description">アドオンと探索ソースを管理</string>
<string name="compose_settings_root_content_discovery_description_appstore">アドオンを管理して、Nuvioに表示する内容を選べます。</string>
<string name="compose_settings_root_downloads_description">ダウンロードした映画とエピソードを管理</string>
<string name="compose_settings_root_downloads_description_appstore">このデバイスに保存した項目を管理します。</string>
<string name="compose_settings_root_downloads_title">ダウンロード</string>
<string name="compose_settings_root_general_section">一般</string>
<string name="compose_settings_root_integrations_description">利用可能な連携を管理</string>
@ -638,7 +642,7 @@
<string name="settings_content_discovery_section_home">ホーム</string>
<string name="settings_content_discovery_section_sources">ソース</string>
<string name="settings_content_discovery_addons_description">コンテンツソースのインストール・削除・更新・並べ替え</string>
<string name="settings_content_discovery_addons_description_appstore">個人メディアソースを接続し、自分専用ライブラリへのアクセスを管理します。</string>
<string name="settings_content_discovery_addons_description_appstore">Nuvioで使うアドオンを追加・管理します。</string>
<string name="settings_content_discovery_plugins_description">JavaScriptスクレイパーリポジトリのインストールと内部テスト</string>
<string name="settings_content_discovery_homescreen_description">ホームレイアウト・コンテンツ表示・ポスターの動作を調整</string>
<string name="settings_content_discovery_meta_screen_description">詳細画面とエピソード画面の設定</string>

View file

@ -29,6 +29,13 @@
<string name="addons_badge_unavailable">Utilgjengelig</string>
<string name="addons_configure">Konfigurer tillegg</string>
<string name="addons_delete">Slett tillegg</string>
<string name="addons_appstore_add_description">Ta med biblioteket ditt til Nuvio med tilleggene du bruker.</string>
<string name="addons_appstore_empty_subtitle">Legg til et tillegg for å begynne å bygge biblioteket ditt.</string>
<string name="addons_appstore_empty_title">Gjør Nuvio til ditt.</string>
<string name="addons_appstore_input_placeholder">URL til tillegg</string>
<string name="addons_appstore_install_button">Legg til tillegg</string>
<string name="store_empty_unavailable_title">Det er ingenting her ennå</string>
<string name="store_empty_unavailable_message">Tilleggene du bruker, har ingenting å vise her ennå.</string>
<string name="addons_empty_subtitle">Legg til en manifest-URL for å starte lasting av kataloger, metadata, strømmer eller undertekster i Nuvio.</string>
<string name="addons_empty_title">Ingen tillegg installert ennå.</string>
<string name="addons_error_enter_url">Skriv inn en tilleggs-URL.</string>
@ -400,7 +407,9 @@
<string name="compose_settings_root_check_updates_description">Last ned nyeste versjon</string>
<string name="compose_settings_root_check_updates_title">Se etter oppdateringer</string>
<string name="compose_settings_root_content_discovery_description">Administrer tillegg og oppdagelseskilder.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Administrer tillegg og velg hva som vises i Nuvio.</string>
<string name="compose_settings_root_downloads_description">Administrer nedlastede filmer og episoder.</string>
<string name="compose_settings_root_downloads_description_appstore">Administrer det du har lagret på denne enheten.</string>
<string name="compose_settings_root_downloads_title">Nedlastinger</string>
<string name="compose_settings_root_general_section">GENERELT</string>
<string name="compose_settings_root_integrations_description">Administrer tilgjengelige integrasjoner</string>
@ -581,6 +590,7 @@
<string name="settings_content_discovery_section_home">HJEM</string>
<string name="settings_content_discovery_section_sources">KILDER</string>
<string name="settings_content_discovery_addons_description">Installer, fjern, oppdater og sorter innholdskilder.</string>
<string name="settings_content_discovery_addons_description_appstore">Legg til og administrer tilleggene du bruker med Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Installer JavaScript-scraper-repositories og test providere internt.</string>
<string name="settings_content_discovery_homescreen_description">Juster hjemmeoppsett, synlighet og plakat-oppførsel.</string>
<string name="settings_content_discovery_meta_screen_description">Innstillinger for detalj- og episodeskjermer.</string>

View file

@ -32,11 +32,13 @@
<string name="addons_badge_unavailable">Niet beschikbaar</string>
<string name="addons_configure">Addon configureren</string>
<string name="addons_delete">Addon verwijderen</string>
<string name="addons_appstore_add_description">Verbind je eigen mediaserver om je persoonlijke bibliotheek te bekijken en af te spelen.</string>
<string name="addons_appstore_empty_subtitle">Voeg hierboven een server-URL toe als je wilt dat Nuvio je privébibliotheek toont.</string>
<string name="addons_appstore_empty_title">Geen persoonlijke bibliotheken verbonden.</string>
<string name="addons_appstore_input_placeholder">Server-URL</string>
<string name="addons_appstore_install_button">Toevoegen</string>
<string name="addons_appstore_add_description">Breng je bibliotheek naar Nuvio met de add-ons die je gebruikt.</string>
<string name="addons_appstore_empty_subtitle">Voeg een add-on toe om je bibliotheek op te bouwen.</string>
<string name="addons_appstore_empty_title">Maak Nuvio helemaal van jou.</string>
<string name="addons_appstore_input_placeholder">Add-on-URL</string>
<string name="addons_appstore_install_button">Add-on toevoegen</string>
<string name="store_empty_unavailable_title">Hier is nog niets</string>
<string name="store_empty_unavailable_message">Je huidige add-ons hebben hier nog niets om te tonen.</string>
<string name="addons_empty_subtitle">Voeg een manifest-URL toe om catalogi, metadata, streams of ondertitels in Nuvio te laden.</string>
<string name="addons_empty_title">Nog geen addons geïnstalleerd.</string>
<string name="addons_error_enter_url">Voer een addon-URL in.</string>
@ -442,7 +444,9 @@
<string name="compose_settings_root_check_updates_description">Download de laatste versie</string>
<string name="compose_settings_root_check_updates_title">Controleren op updates</string>
<string name="compose_settings_root_content_discovery_description">Beheer addons en ontdekkingsbronnen.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Beheer add-ons en kies wat er in Nuvio verschijnt.</string>
<string name="compose_settings_root_downloads_description">Beheer je gedownloade films en afleveringen.</string>
<string name="compose_settings_root_downloads_description_appstore">Beheer wat je op dit apparaat hebt opgeslagen.</string>
<string name="compose_settings_root_downloads_title">Downloads</string>
<string name="compose_settings_root_general_section">ALGEMEEN</string>
<string name="compose_settings_root_integrations_description">Beheer beschikbare integraties</string>
@ -656,7 +660,7 @@
<string name="settings_content_discovery_section_home">HOME</string>
<string name="settings_content_discovery_section_sources">BRONNEN</string>
<string name="settings_content_discovery_addons_description">Installeer, verwijder, vernieuw en sorteer je contentbronnen.</string>
<string name="settings_content_discovery_addons_description_appstore">Verbind persoonlijke mediabronnen en beheer toegang tot je eigen bibliotheek.</string>
<string name="settings_content_discovery_addons_description_appstore">Voeg de add-ons toe die je met Nuvio gebruikt en beheer ze.</string>
<string name="settings_content_discovery_plugins_description">Installeer JavaScript-scraperrepository's en test providers intern.</string>
<string name="settings_content_discovery_homescreen_description">Pas startschermindeling, zichtbaarheid van inhoud en postergedrag aan</string>
<string name="settings_content_discovery_meta_screen_description">Instellingen voor de detail- en afleveringsschermen.</string>

View file

@ -31,6 +31,13 @@
<string name="addons_badge_unavailable">Niedostępny</string>
<string name="addons_configure">Konfiguruj dodatek</string>
<string name="addons_delete">Usuń dodatek</string>
<string name="addons_appstore_add_description">Przenieś swoją bibliotekę do Nuvio za pomocą używanych dodatków.</string>
<string name="addons_appstore_empty_subtitle">Dodaj dodatek, aby zacząć tworzyć swoją bibliotekę.</string>
<string name="addons_appstore_empty_title">Dostosuj Nuvio do siebie.</string>
<string name="addons_appstore_input_placeholder">URL dodatku</string>
<string name="addons_appstore_install_button">Dodaj dodatek</string>
<string name="store_empty_unavailable_title">Na razie nic tu nie ma</string>
<string name="store_empty_unavailable_message">Używane dodatki nie mają jeszcze nic do wyświetlenia.</string>
<string name="addons_empty_subtitle">Dodaj URL manifestu, aby zacząć ładować katalogi, metadane, strumienie lub napisy do Nuvio.</string>
<string name="addons_empty_title">Brak zainstalowanych dodatków.</string>
<string name="addons_error_enter_url">Wprowadź URL dodatku.</string>
@ -412,7 +419,9 @@
<string name="compose_settings_root_check_updates_description">Sprawdź dostępność nowych wersji aplikacji.</string>
<string name="compose_settings_root_check_updates_title">Sprawdź aktualizacje</string>
<string name="compose_settings_root_content_discovery_description">Zarządzaj dodatkami i źródłami odkrywania.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Zarządzaj dodatkami i wybierz, co ma być widoczne w Nuvio.</string>
<string name="compose_settings_root_downloads_description">Zarządzaj pobranymi filmami i odcinkami.</string>
<string name="compose_settings_root_downloads_description_appstore">Zarządzaj zawartością zapisaną na tym urządzeniu.</string>
<string name="compose_settings_root_downloads_title">Pobrane</string>
<string name="compose_settings_root_general_section">OGÓLNE</string>
<string name="compose_settings_root_integrations_description">Połącz usługi TMDB i MDBList.</string>
@ -597,6 +606,7 @@
<string name="settings_content_discovery_section_home">EKRAN GŁÓWNY</string>
<string name="settings_content_discovery_section_sources">ŹRÓDŁA</string>
<string name="settings_content_discovery_addons_description">Instaluj, usuwaj, odświeżaj i sortuj źródła treści.</string>
<string name="settings_content_discovery_addons_description_appstore">Dodawaj używane w Nuvio dodatki i zarządzaj nimi.</string>
<string name="settings_content_discovery_plugins_description">Instaluj repozytoria scraperów JavaScript i testuj dostawców wewnętrznie.</string>
<string name="settings_content_discovery_homescreen_description">Kontroluj, które katalogi pojawiają się na ekranie głównym i w jakiej kolejności.</string>
<string name="settings_content_discovery_meta_screen_description">Wyłącz sekcje szczegółów i zmień kolejność wszystkiego poniżej Hero.</string>

View file

@ -30,6 +30,13 @@
<string name="addons_badge_unavailable">Indisponível</string>
<string name="addons_configure">Configurar addon</string>
<string name="addons_delete">Excluir addon</string>
<string name="addons_appstore_add_description">Leve sua biblioteca para o Nuvio com os addons que você usa.</string>
<string name="addons_appstore_empty_subtitle">Adicione um addon para começar a montar sua biblioteca.</string>
<string name="addons_appstore_empty_title">Deixe o Nuvio do seu jeito.</string>
<string name="addons_appstore_input_placeholder">URL do addon</string>
<string name="addons_appstore_install_button">Adicionar addon</string>
<string name="store_empty_unavailable_title">Ainda não há nada aqui</string>
<string name="store_empty_unavailable_message">Os addons que você usa ainda não têm nada para mostrar aqui.</string>
<string name="addons_empty_subtitle">Adicione uma URL de manifesto para começar a carregar catálogos, metadados, streams ou legendas no Nuvio.</string>
<string name="addons_empty_title">Nenhum addon instalado ainda.</string>
<string name="addons_error_enter_url">Insira uma URL de addon.</string>
@ -401,7 +408,9 @@
<string name="compose_settings_root_check_updates_description">Baixar a versão mais recente</string>
<string name="compose_settings_root_check_updates_title">Verificar atualizações</string>
<string name="compose_settings_root_content_discovery_description">Gerenciar addons e fontes de descoberta.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Gerencie addons e escolha o que aparece no Nuvio.</string>
<string name="compose_settings_root_downloads_description">Gerencie seus filmes e episódios baixados.</string>
<string name="compose_settings_root_downloads_description_appstore">Gerencie o que você salvou neste dispositivo.</string>
<string name="compose_settings_root_downloads_title">Downloads</string>
<string name="compose_settings_root_general_section">GERAL</string>
<string name="compose_settings_root_integrations_description">Gerenciar integrações disponíveis</string>
@ -582,6 +591,7 @@
<string name="settings_content_discovery_section_home">PÁGINA INICIAL</string>
<string name="settings_content_discovery_section_sources">FONTES</string>
<string name="settings_content_discovery_addons_description">Instale, remova, atualize e ordene suas fontes de conteúdo.</string>
<string name="settings_content_discovery_addons_description_appstore">Adicione e gerencie os addons que você usa com o Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Instale repositórios de scraper JavaScript e teste provedores internamente.</string>
<string name="settings_content_discovery_homescreen_description">Ajuste layout da página inicial, visibilidade de conteúdo e comportamento de pôsteres</string>
<string name="settings_content_discovery_meta_screen_description">Configurações para as telas de detalhes e episódios.</string>

View file

@ -31,6 +31,13 @@
<string name="addons_badge_unavailable">Indisponível</string>
<string name="addons_configure">Configurar addon</string>
<string name="addons_delete">Eliminar addon</string>
<string name="addons_appstore_add_description">Leva a tua biblioteca para o Nuvio com os addons que usas.</string>
<string name="addons_appstore_empty_subtitle">Adiciona um addon para começares a criar a tua biblioteca.</string>
<string name="addons_appstore_empty_title">Deixa o Nuvio à tua maneira.</string>
<string name="addons_appstore_input_placeholder">URL do addon</string>
<string name="addons_appstore_install_button">Adicionar addon</string>
<string name="store_empty_unavailable_title">Ainda não há nada aqui</string>
<string name="store_empty_unavailable_message">Os addons que usas ainda não têm nada para mostrar aqui.</string>
<string name="addons_empty_subtitle">Adiciona um URL de manifesto para começares a carregar catálogos, metadados, streams ou legendas no Nuvio.</string>
<string name="addons_empty_title">Ainda não tens addons instalados.</string>
<string name="addons_error_enter_url">Introduz o URL de um addon.</string>
@ -432,7 +439,9 @@
<string name="compose_settings_root_check_updates_description">Transferir a versão mais recente</string>
<string name="compose_settings_root_check_updates_title">Procurar atualizações</string>
<string name="compose_settings_root_content_discovery_description">Gere addons e fontes de descoberta.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Gere os addons e escolhe o que aparece no Nuvio.</string>
<string name="compose_settings_root_downloads_description">Gere os teus filmes e episódios transferidos.</string>
<string name="compose_settings_root_downloads_description_appstore">Gere o que guardaste neste dispositivo.</string>
<string name="compose_settings_root_downloads_title">Transferências</string>
<string name="compose_settings_root_general_section">GERAL</string>
<string name="compose_settings_root_integrations_description">Gere as integrações disponíveis</string>
@ -627,6 +636,7 @@
<string name="settings_content_discovery_section_home">PÁGINA INICIAL</string>
<string name="settings_content_discovery_section_sources">FONTES</string>
<string name="settings_content_discovery_addons_description">Instala, remove, atualiza e ordena as tuas fontes de conteúdo.</string>
<string name="settings_content_discovery_addons_description_appstore">Adiciona e gere os addons que usas com o Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Instala repositórios de scrapers JavaScript e testa fornecedores internamente.</string>
<string name="settings_content_discovery_homescreen_description">Ajusta o esquema da página inicial, a visibilidade do conteúdo e o comportamento dos cartazes.</string>
<string name="settings_content_discovery_meta_screen_description">Definições para as páginas de detalhes e de episódios.</string>

View file

@ -32,11 +32,13 @@
<string name="addons_badge_unavailable">Indisponibil</string>
<string name="addons_configure">Configurează extensia</string>
<string name="addons_delete">Șterge extensia</string>
<string name="addons_appstore_add_description">Conectează-ți propriul server media pentru a naviga și a reda din biblioteca personală.</string>
<string name="addons_appstore_empty_subtitle">Adaugă un URL de server mai sus când vrei ca Nuvio să îți afișeze biblioteca privată.</string>
<string name="addons_appstore_empty_title">Nicio bibliotecă personală conectată.</string>
<string name="addons_appstore_input_placeholder">URL Server</string>
<string name="addons_appstore_install_button">Adaugă</string>
<string name="addons_appstore_add_description">Folosește extensiile preferate pentru a-ți aduce biblioteca în Nuvio.</string>
<string name="addons_appstore_empty_subtitle">Adaugă o extensie pentru a începe să-ți construiești biblioteca.</string>
<string name="addons_appstore_empty_title">Personalizează Nuvio.</string>
<string name="addons_appstore_input_placeholder">URL extensie</string>
<string name="addons_appstore_install_button">Adaugă extensie</string>
<string name="store_empty_unavailable_title">Nu este nimic aici încă</string>
<string name="store_empty_unavailable_message">Extensiile pe care le folosești nu au încă nimic de afișat aici.</string>
<string name="addons_empty_subtitle">Adaugă un URL de manifest pentru a începe încărcarea de cataloage, metadate, fluxuri sau subtitrări în Nuvio.</string>
<string name="addons_empty_title">Nu există extensii instalate încă.</string>
<string name="addons_error_enter_url">Introdu un URL pentru extensie.</string>
@ -442,7 +444,9 @@
<string name="compose_settings_root_check_updates_description">Descarcă cea mai recentă versiune</string>
<string name="compose_settings_root_check_updates_title">Caută actualizări</string>
<string name="compose_settings_root_content_discovery_description">Gestionează extensiile și sursele de descoperire.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Gestionează extensiile și alege ce apare în Nuvio.</string>
<string name="compose_settings_root_downloads_description">Gestionează filmele și episoadele descărcate.</string>
<string name="compose_settings_root_downloads_description_appstore">Gestionează ce ai salvat pe acest dispozitiv.</string>
<string name="compose_settings_root_downloads_title">Descărcări</string>
<string name="compose_settings_root_general_section">GENERAL</string>
<string name="compose_settings_root_integrations_description">Gestionează integrările disponibile</string>
@ -656,7 +660,7 @@
<string name="settings_content_discovery_section_home">ECRAN PRINCIPAL</string>
<string name="settings_content_discovery_section_sources">SURSE</string>
<string name="settings_content_discovery_addons_description">Instalează, elimină, reîmprospătează și sortează sursele de conținut.</string>
<string name="settings_content_discovery_addons_description_appstore">Conectează surse media personale și gestionează accesul la propria bibliotecă.</string>
<string name="settings_content_discovery_addons_description_appstore">Adaugă și gestionează extensiile pe care le folosești cu Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Instalează depozite de scraper JavaScript și testează furnizorii intern.</string>
<string name="settings_content_discovery_homescreen_description">Ajustează aspectul ecranului principal, vizibilitatea conținutului și comportamentul posterului</string>
<string name="settings_content_discovery_meta_screen_description">Setări pentru ecranele de detalii și de episoade.</string>
@ -1932,4 +1936,4 @@
<item quantity="one">%d titlu</item>
<item quantity="other">%d titluri</item>
</plurals>
</resources>
</resources>

View file

@ -434,7 +434,9 @@
<string name="compose_settings_root_check_updates_description">Stiahnuť najnovšie vydanie</string>
<string name="compose_settings_root_check_updates_title">Skontrolovať aktualizácie</string>
<string name="compose_settings_root_content_discovery_description">Spravovať doplnky a zdroje objavovania.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Spravujte doplnky a vyberte, čo sa má zobrazovať v Nuviu.</string>
<string name="compose_settings_root_downloads_description">Spravovať stiahnuté filmy a epizódy.</string>
<string name="compose_settings_root_downloads_description_appstore">Spravujte obsah uložený v tomto zariadení.</string>
<string name="compose_settings_root_downloads_title">Stiahnuté</string>
<string name="compose_settings_root_general_section">VŠEOBECNÉ</string>
<string name="compose_settings_root_integrations_description">Spravovať dostupné integrácie</string>
@ -1898,15 +1900,17 @@
<string name="player_error_torrent">Chyba torrentu: %1$s</string>
<!-- Current cmp-rewrite string additions -->
<string name="action_switch">Prepnúť</string>
<string name="addons_appstore_add_description">Pripojte vlastný mediálny server na prehliadanie a prehrávanie z vašej osobnej knižnice.</string>
<string name="addons_appstore_empty_subtitle">Pridajte URL servera vyššie, ak chcete, aby Nuvio zobrazovalo vašu súkromnú knižnicu.</string>
<string name="addons_appstore_empty_title">Nie sú pripojené žiadne osobné knižnice.</string>
<string name="addons_appstore_input_placeholder">URL servera</string>
<string name="addons_appstore_install_button">Pridať</string>
<string name="addons_appstore_add_description">Preneste svoju knižnicu do Nuvia pomocou doplnkov, ktoré používate.</string>
<string name="addons_appstore_empty_subtitle">Pridajte doplnok a začnite si vytvárať knižnicu.</string>
<string name="addons_appstore_empty_title">Prispôsobte si Nuvio.</string>
<string name="addons_appstore_input_placeholder">URL doplnku</string>
<string name="addons_appstore_install_button">Pridať doplnok</string>
<string name="store_empty_unavailable_title">Zatiaľ tu nič nie je</string>
<string name="store_empty_unavailable_message">Doplnky, ktoré používate, tu zatiaľ nemajú čo zobraziť.</string>
<string name="compose_auth_terms_prefix">Registráciou súhlasím s</string>
<string name="compose_auth_terms_link">Podmienkami</string>
<string name="settings_appearance_app_language_device">Jazyk zariadenia</string>
<string name="settings_content_discovery_addons_description_appstore">Pripojte osobné mediálne zdroje a spravujte prístup k vlastnej knižnici.</string>
<string name="settings_content_discovery_addons_description_appstore">Pridávajte a spravujte doplnky, ktoré používate s Nuviom.</string>
<string name="settings_playback_external_player_send_skip_segments">Odosielať časové značky intra a outra</string>
<string name="settings_playback_external_player_send_skip_segments_description">Odovzdať vyriešené časové značky intra a outra externému prehrávaču na automatické preskakovanie. Funguje iba v prehrávačoch, ktoré to podporujú; ostatné prehrávače to ignorujú.</string>
<string name="settings_playback_option_original">Pôvodný jazyk</string>

View file

@ -31,6 +31,13 @@
<string name="addons_badge_unavailable">Kullanılamıyor</string>
<string name="addons_configure">Eklentiyi ayarla</string>
<string name="addons_delete">Eklentiyi sil</string>
<string name="addons_appstore_add_description">Kullandığın eklentilerle kitaplığını Nuvio'ya taşı.</string>
<string name="addons_appstore_empty_subtitle">Kitaplığını oluşturmaya başlamak için bir eklenti ekle.</string>
<string name="addons_appstore_empty_title">Nuvio'yu kendine göre ayarla.</string>
<string name="addons_appstore_input_placeholder">Eklenti URL'si</string>
<string name="addons_appstore_install_button">Eklenti ekle</string>
<string name="store_empty_unavailable_title">Burada henüz bir şey yok</string>
<string name="store_empty_unavailable_message">Kullandığın eklentilerin burada gösterecek bir şeyi yok.</string>
<string name="addons_empty_subtitle">Nuvio'ya katalog, meta veri, yayın veya altyazı yüklemeye başlamak için bir manifest URL'si ekle.</string>
<string name="addons_empty_title">Henüz eklenti kurulmamış.</string>
<string name="addons_error_enter_url">Bir eklenti URL'si gir.</string>
@ -402,7 +409,9 @@
<string name="compose_settings_root_check_updates_description">Uygulamanın yeni sürümü var mı kontrol et.</string>
<string name="compose_settings_root_check_updates_title">Güncellemeleri kontrol et</string>
<string name="compose_settings_root_content_discovery_description">Eklentileri ve keşif kaynaklarını yönet.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Eklentileri yönet ve Nuvioda nelerin görüneceğini seç.</string>
<string name="compose_settings_root_downloads_description">İndirdiğin film ve bölümleri yönet.</string>
<string name="compose_settings_root_downloads_description_appstore">Bu cihaza kaydettiklerini yönet.</string>
<string name="compose_settings_root_downloads_title">İndirilenler</string>
<string name="compose_settings_root_general_section">GENEL</string>
<string name="compose_settings_root_integrations_description">TMDB ve MDBList servislerini bağla.</string>
@ -587,6 +596,7 @@
<string name="settings_content_discovery_section_home">ANA SAYFA</string>
<string name="settings_content_discovery_section_sources">KAYNAKLAR</string>
<string name="settings_content_discovery_addons_description">İçerik kaynaklarını kur, kaldır, yenile ve sırala.</string>
<string name="settings_content_discovery_addons_description_appstore">Nuvio ile kullandığın eklentileri ekle ve yönet.</string>
<string name="settings_content_discovery_plugins_description">JavaScript scraper depoları kur ve sağlayıcıları içeriden test et.</string>
<string name="settings_content_discovery_homescreen_description">Ana sayfada hangi katalogların hangi sırayla görüneceğini kontrol et.</string>
<string name="settings_content_discovery_meta_screen_description">Detay bölümlerini kapat ve öne çıkanların altındaki her şeyi yeniden sırala.</string>

View file

@ -32,11 +32,13 @@
<string name="addons_badge_unavailable">Không khả dụng</string>
<string name="addons_configure">Cấu hình addon</string>
<string name="addons_delete">Xóa addon</string>
<string name="addons_appstore_add_description">Kết nối máy chủ nội dung của bạn để duyệt và phát thư viện cá nhân.</string>
<string name="addons_appstore_empty_subtitle">Thêm URL máy chủ ở trên để Nuvio hiển thị thư viện riêng của bạn.</string>
<string name="addons_appstore_empty_title">Chưa kết nối thư viện cá nhân.</string>
<string name="addons_appstore_input_placeholder">URL máy chủ</string>
<string name="addons_appstore_install_button">Thêm</string>
<string name="addons_appstore_add_description">Đưa thư viện của bạn vào Nuvio với các addon bạn sử dụng.</string>
<string name="addons_appstore_empty_subtitle">Thêm một addon để bắt đầu xây dựng thư viện của bạn.</string>
<string name="addons_appstore_empty_title">Tùy chỉnh Nuvio theo cách của bạn.</string>
<string name="addons_appstore_input_placeholder">URL addon</string>
<string name="addons_appstore_install_button">Thêm addon</string>
<string name="store_empty_unavailable_title">Chưa có nội dung nào ở đây</string>
<string name="store_empty_unavailable_message">Các addon bạn đang dùng chưa có nội dung để hiển thị ở đây.</string>
<string name="addons_empty_subtitle">Thêm URL manifest để tải danh mục, thông tin, nguồn phát hoặc phụ đề vào Nuvio.</string>
<string name="addons_empty_title">Chưa cài addon nào.</string>
<string name="addons_error_enter_url">Nhập URL addon.</string>
@ -442,7 +444,9 @@
<string name="compose_settings_root_check_updates_description">Tải phiên bản mới nhất.</string>
<string name="compose_settings_root_check_updates_title">Kiểm tra cập nhật</string>
<string name="compose_settings_root_content_discovery_description">Quản lý addon và các nguồn khám phá nội dung.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Quản lý addon và chọn nội dung hiển thị trong Nuvio.</string>
<string name="compose_settings_root_downloads_description">Quản lý phim và tập đã tải xuống.</string>
<string name="compose_settings_root_downloads_description_appstore">Quản lý nội dung bạn đã lưu trên thiết bị này.</string>
<string name="compose_settings_root_downloads_title">Tải xuống</string>
<string name="compose_settings_root_general_section">CHUNG</string>
<string name="compose_settings_root_integrations_description">Quản lý các dịch vụ tích hợp.</string>
@ -641,7 +645,7 @@
<string name="settings_content_discovery_section_home">TRANG CHỦ</string>
<string name="settings_content_discovery_section_sources">NGUỒN</string>
<string name="settings_content_discovery_addons_description">Cài đặt, xóa, làm mới và sắp xếp các nguồn nội dung.</string>
<string name="settings_content_discovery_addons_description_appstore">Kết nối nguồn nội dung cá nhân và quản lý thư viện riêng của bạn.</string>
<string name="settings_content_discovery_addons_description_appstore">Thêm và quản lý các addon bạn sử dụng với Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Cài đặt kho Plugin JavaScript và thử nghiệm các dịch vụ nội bộ.</string>
<string name="settings_content_discovery_homescreen_description">Điều chỉnh bố cục Trang chủ, khả năng hiển thị nội dung và cách hiển thị poster.</string>
<string name="settings_content_discovery_meta_screen_description">Thiết lập cho trang chi tiết và danh sách tập.</string>
@ -1924,4 +1928,4 @@
<string name="player_torrent_starting_engine">Đang khởi động Engine P2P…</string>
<string name="player_error_failed_start_torrent">Không thể khởi động torrent: %1$s</string>
<string name="player_error_torrent">Lỗi torrent: %1$s</string>
</resources>
</resources>

View file

@ -32,11 +32,13 @@
<string name="addons_badge_unavailable">Unavailable</string>
<string name="addons_configure">Configure addon</string>
<string name="addons_delete">Delete addon</string>
<string name="addons_appstore_add_description">Connect your own media server to browse and play from your personal library.</string>
<string name="addons_appstore_empty_subtitle">Add a server URL above when you want Nuvio to show your private library.</string>
<string name="addons_appstore_empty_title">No personal libraries connected.</string>
<string name="addons_appstore_input_placeholder">Server URL</string>
<string name="addons_appstore_install_button">Add</string>
<string name="addons_appstore_add_description">Bring your library into Nuvio with the addons you use.</string>
<string name="addons_appstore_empty_subtitle">Add an addon to start building your library.</string>
<string name="addons_appstore_empty_title">Make Nuvio yours.</string>
<string name="addons_appstore_input_placeholder">Addon URL</string>
<string name="addons_appstore_install_button">Add Addon</string>
<string name="store_empty_unavailable_title">Nothing here yet</string>
<string name="store_empty_unavailable_message">Your current addons dont have anything to show here.</string>
<string name="addons_empty_subtitle">Add a manifest URL to start loading catalogs, metadata, streams or subtitles into Nuvio.</string>
<string name="addons_empty_title">No addons installed yet.</string>
<string name="addons_error_enter_url">Enter an addon URL.</string>
@ -442,7 +444,9 @@
<string name="compose_settings_root_check_updates_description">Download latest release</string>
<string name="compose_settings_root_check_updates_title">Check for updates</string>
<string name="compose_settings_root_content_discovery_description">Manage addons and discovery sources.</string>
<string name="compose_settings_root_content_discovery_description_appstore">Manage addons and choose what appears in Nuvio.</string>
<string name="compose_settings_root_downloads_description">Manage your downloaded movies and episodes.</string>
<string name="compose_settings_root_downloads_description_appstore">Manage what youve saved on this device.</string>
<string name="compose_settings_root_downloads_title">Downloads</string>
<string name="compose_settings_root_general_section">GENERAL</string>
<string name="compose_settings_root_integrations_description">Manage available integrations</string>
@ -687,7 +691,7 @@
<string name="settings_content_discovery_section_home">HOME</string>
<string name="settings_content_discovery_section_sources">SOURCES</string>
<string name="settings_content_discovery_addons_description">Install, remove, refresh, and sort your content sources.</string>
<string name="settings_content_discovery_addons_description_appstore">Connect personal media sources and manage access to your own library.</string>
<string name="settings_content_discovery_addons_description_appstore">Add and manage the addons you use with Nuvio.</string>
<string name="settings_content_discovery_plugins_description">Install JavaScript scraper repositories and test providers internally.</string>
<string name="settings_content_discovery_homescreen_description">Adjust home layout, content visibility, and poster behavior</string>
<string name="settings_content_discovery_meta_screen_description">Settings for the detail and episode screens.</string>

View file

@ -9,7 +9,7 @@ expect object AppFeaturePolicy {
val pluginsEnabled: Boolean
val supportersContributorsPageEnabled: Boolean
val accountDeletionEnabled: Boolean
val personalMediaAddonCopyEnabled: Boolean
val storeNarrativeEnabled: Boolean
val p2pEnabled: Boolean
val trailerPlaybackMode: TrailerPlaybackMode
val heroTrailerPlaybackSupported: Boolean

View file

@ -0,0 +1,83 @@
package com.nuvio.app.core.ui
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.SearchOff
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@Composable
fun NuvioEmptyState(
title: String,
message: String? = null,
modifier: Modifier = Modifier,
icon: ImageVector = Icons.Rounded.SearchOff,
iconPainter: Painter? = null,
actionLabel: String? = null,
onActionClick: (() -> Unit)? = null,
) {
Column(
modifier = modifier
.fillMaxWidth()
.padding(32.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterVertically),
) {
if (iconPainter != null) {
Icon(
painter = iconPainter,
contentDescription = null,
modifier = Modifier.size(48.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f),
)
} else {
Icon(
imageVector = icon,
contentDescription = null,
modifier = Modifier.size(48.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f),
)
}
Spacer(modifier = Modifier.height(8.dp))
Text(
text = title,
style = MaterialTheme.typography.bodyLarge.copy(
fontSize = 16.sp,
fontWeight = FontWeight.SemiBold,
),
color = MaterialTheme.colorScheme.onSurfaceVariant,
textAlign = TextAlign.Center,
)
if (!message.isNullOrBlank()) {
Text(
text = message,
style = MaterialTheme.typography.bodySmall.copy(fontSize = 14.sp),
color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.7f),
textAlign = TextAlign.Center,
)
}
if (actionLabel != null && onActionClick != null) {
Spacer(modifier = Modifier.height(8.dp))
NuvioPrimaryButton(
text = actionLabel,
onClick = onActionClick,
)
}
}
}

View file

@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
@ -47,6 +48,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.nuvio.app.core.build.AppFeaturePolicy
import coil3.compose.AsyncImage
import com.nuvio.app.core.ui.NuvioIconActionButton
import com.nuvio.app.core.ui.NuvioEmptyState
import com.nuvio.app.core.ui.NuvioInfoBadge
import com.nuvio.app.core.ui.NuvioInputField
import com.nuvio.app.core.ui.NuvioPrimaryButton
@ -94,7 +96,7 @@ internal fun AddonsSettingsPageContent(
var formMessage by rememberSaveable { mutableStateOf<String?>(null) }
var installModalState by remember { mutableStateOf<AddonInstallModalState?>(null) }
val enterAddonUrlMessage = stringResource(Res.string.addons_error_enter_url)
val usePersonalMediaCopy = AppFeaturePolicy.personalMediaAddonCopyEnabled
val useStoreNarrative = AppFeaturePolicy.storeNarrativeEnabled
val overview = remember(uiState.addons) { uiState.addons.toOverview() }
@ -109,7 +111,7 @@ internal fun AddonsSettingsPageContent(
AddAddonCard(
addonUrl = addonUrl,
formMessage = formMessage,
usePersonalMediaCopy = usePersonalMediaCopy,
useStoreNarrative = useStoreNarrative,
onAddonUrlChange = {
addonUrl = it
formMessage = null
@ -141,7 +143,7 @@ internal fun AddonsSettingsPageContent(
SectionHeader(stringResource(Res.string.addons_section_installed))
if (uiState.addons.isEmpty()) {
EmptyStateCard(usePersonalMediaCopy = usePersonalMediaCopy)
EmptyStateCard(useStoreNarrative = useStoreNarrative)
} else {
val lastIndex = uiState.addons.lastIndex
uiState.addons.forEachIndexed { index, addon ->
@ -286,7 +288,7 @@ private fun VerticalSeparator() {
private fun AddAddonCard(
addonUrl: String,
formMessage: String?,
usePersonalMediaCopy: Boolean,
useStoreNarrative: Boolean,
onAddonUrlChange: (String) -> Unit,
onAddClick: () -> Unit,
) {
@ -294,27 +296,15 @@ private fun AddAddonCard(
NuvioInputField(
value = addonUrl,
onValueChange = onAddonUrlChange,
placeholder = stringResource(
if (usePersonalMediaCopy) {
Res.string.addons_appstore_input_placeholder
} else {
Res.string.addons_input_placeholder
},
),
placeholder = stringResource(Res.string.addons_input_placeholder),
)
Spacer(modifier = Modifier.height(18.dp))
NuvioPrimaryButton(
text = stringResource(
if (usePersonalMediaCopy) {
Res.string.addons_appstore_install_button
} else {
Res.string.addons_install_button
},
),
text = stringResource(Res.string.addons_install_button),
enabled = addonUrl.isNotBlank(),
onClick = onAddClick,
)
if (usePersonalMediaCopy) {
if (useStoreNarrative) {
Spacer(modifier = Modifier.height(14.dp))
Text(
text = stringResource(Res.string.addons_appstore_add_description),
@ -355,33 +345,26 @@ private sealed interface AddonInstallModalState {
@Composable
private fun EmptyStateCard(
usePersonalMediaCopy: Boolean,
useStoreNarrative: Boolean,
) {
NuvioSurfaceCard {
Text(
text = stringResource(
if (usePersonalMediaCopy) {
Res.string.addons_appstore_empty_title
} else {
Res.string.addons_empty_title
},
),
style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onSurface,
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = stringResource(
if (usePersonalMediaCopy) {
Res.string.addons_appstore_empty_subtitle
} else {
Res.string.addons_empty_subtitle
},
),
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
}
NuvioEmptyState(
modifier = Modifier.heightIn(min = 220.dp),
icon = Icons.Rounded.Extension,
title = stringResource(
if (useStoreNarrative) {
Res.string.addons_appstore_empty_title
} else {
Res.string.addons_empty_title
},
),
message = stringResource(
if (useStoreNarrative) {
Res.string.addons_appstore_empty_subtitle
} else {
Res.string.addons_empty_subtitle
},
),
)
}
@Composable

View file

@ -23,6 +23,7 @@ import androidx.compose.foundation.lazy.grid.items
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
import androidx.compose.foundation.shape.RoundedCornerShape
import com.nuvio.app.core.ui.NuvioLoadingIndicator
import com.nuvio.app.core.ui.NuvioEmptyState
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@ -162,6 +163,7 @@ fun CatalogScreen(
.background(MaterialTheme.colorScheme.background),
) {
val columns = remember(maxWidth) { catalogGridColumnsForWidth(maxWidth) }
val viewportHeight = maxHeight
Box(modifier = Modifier.fillMaxSize()) {
LazyVerticalGrid(
@ -184,6 +186,9 @@ fun CatalogScreen(
} else if (uiState.items.isEmpty()) {
item(span = { GridItemSpan(maxLineSpan) }) {
CatalogEmptyState(
modifier = Modifier.height(
(viewportHeight - 120.dp).coerceAtLeast(280.dp),
),
errorMessage = uiState.errorMessage,
networkCondition = networkStatusUiState.condition,
onRetry = {
@ -361,6 +366,7 @@ private fun CatalogEmptyState(
errorMessage: String?,
networkCondition: NetworkCondition,
onRetry: (() -> Unit)? = null,
modifier: Modifier = Modifier,
) {
if (networkCondition == NetworkCondition.NoInternet || networkCondition == NetworkCondition.ServersUnreachable) {
NuvioNetworkOfflineCard(
@ -370,24 +376,11 @@ private fun CatalogEmptyState(
return
}
Column(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 48.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(10.dp),
) {
Text(
text = stringResource(Res.string.catalog_empty_title),
style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground,
)
Text(
text = errorMessage ?: stringResource(Res.string.catalog_empty_message),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
}
NuvioEmptyState(
modifier = modifier,
title = stringResource(Res.string.catalog_empty_title),
message = errorMessage ?: stringResource(Res.string.catalog_empty_message),
)
}
@Composable

View file

@ -2,7 +2,6 @@ package com.nuvio.app.features.downloads
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
@ -14,7 +13,7 @@ import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Delete
import androidx.compose.material.icons.rounded.Folder
import androidx.compose.material.icons.rounded.Download
import androidx.compose.material.icons.rounded.Pause
import androidx.compose.material.icons.rounded.PlayArrow
import androidx.compose.material.icons.rounded.Refresh
@ -38,8 +37,8 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.nuvio.app.core.i18n.localizedByteUnit
import com.nuvio.app.core.ui.NuvioScreen
import com.nuvio.app.core.ui.NuvioEmptyState
import com.nuvio.app.core.ui.NuvioScreenHeader
import com.nuvio.app.core.ui.NuvioToastController
import nuvio.composeapp.generated.resources.*
import org.jetbrains.compose.resources.stringResource
@ -57,8 +56,6 @@ fun DownloadsScreen(
}.collectAsStateWithLifecycle()
var selectedShowId by rememberSaveable(initialShowId) { mutableStateOf(initialShowId) }
val openDownloadsDirectoryFailedText = stringResource(Res.string.downloads_open_directory_failed)
val completedEpisodes = remember(uiState.items) {
uiState.completedItems
.filter { it.isEpisode }
@ -86,20 +83,6 @@ fun DownloadsScreen(
onBack()
}
},
actions = {
IconButton(
onClick = {
if (!DownloadsPlatformDownloader.openDownloadsDirectory()) {
NuvioToastController.show(openDownloadsDirectoryFailedText)
}
},
) {
Icon(
imageVector = Icons.Rounded.Folder,
contentDescription = stringResource(Res.string.downloads_open_directory),
)
}
},
)
}
@ -228,18 +211,11 @@ private fun LazyListScope.downloadsRootContent(
if (uiState.items.isEmpty()) {
item {
Box(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 40.dp),
contentAlignment = Alignment.Center,
) {
Text(
text = stringResource(Res.string.downloads_empty_title),
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
}
NuvioEmptyState(
modifier = Modifier.fillParentMaxHeight(),
icon = Icons.Rounded.Download,
title = stringResource(Res.string.downloads_empty_title),
)
}
}
}
@ -264,18 +240,11 @@ private fun LazyListScope.downloadsShowContent(
if (seasons.isEmpty()) {
item {
Box(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 40.dp),
contentAlignment = Alignment.Center,
) {
Text(
text = stringResource(Res.string.downloads_empty_episodes),
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
}
NuvioEmptyState(
modifier = Modifier.fillParentMaxHeight(),
icon = Icons.Rounded.Download,
title = stringResource(Res.string.downloads_empty_episodes),
)
}
return
}

View file

@ -15,6 +15,7 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.nuvio.app.core.auth.AuthRepository
import com.nuvio.app.core.auth.AuthState
import com.nuvio.app.core.build.AppFeaturePolicy
import com.nuvio.app.core.network.NetworkCondition
import com.nuvio.app.core.network.NetworkStatusRepository
import com.nuvio.app.core.ui.LocalNuvioBottomNavigationOverlayPadding
@ -36,7 +37,6 @@ import com.nuvio.app.features.details.seriesPrimaryAction
import com.nuvio.app.features.home.components.HomeCatalogRowSection
import com.nuvio.app.features.home.components.HomeContinueWatchingSection
import com.nuvio.app.features.home.components.HomeEmptyStateCard
import com.nuvio.app.features.home.components.HomeHeroReservedSpace
import com.nuvio.app.features.home.components.HomeHeroSection
import com.nuvio.app.features.home.components.HomeSkeletonHero
import com.nuvio.app.features.home.components.HomeSkeletonRow
@ -107,7 +107,6 @@ fun HomeScreen(
onFirstCatalogRendered: (() -> Unit)? = null,
) {
LaunchedEffect(Unit) {
AddonRepository.initialize()
CollectionRepository.initialize()
ContinueWatchingPreferencesRepository.ensureLoaded()
WatchedRepository.ensureLoaded()
@ -118,7 +117,10 @@ fun HomeScreen(
}
}
val addonsUiState by AddonRepository.uiState.collectAsStateWithLifecycle()
val addonsUiState by remember {
AddonRepository.initialize()
AddonRepository.uiState
}.collectAsStateWithLifecycle()
val homeUiState by HomeRepository.uiState.collectAsStateWithLifecycle()
val homeSettingsUiState by remember {
HomeCatalogSettingsRepository.snapshot()
@ -440,7 +442,6 @@ fun HomeScreen(
}
LaunchedEffect(catalogRefreshKey) {
if (catalogRefreshKey.isEmpty()) return@LaunchedEffect
HomeCatalogSettingsRepository.syncCatalogs(enabledAddons)
HomeRepository.refresh(enabledAddons)
}
@ -655,11 +656,15 @@ fun HomeScreen(
}
val hasActiveAddons = enabledAddons.any { it.manifest != null }
val showHeroSlot = homeSettingsUiState.heroEnabled
val hasCurrentHeroSource = enabledAddons.any { it.manifest != null || it.isRefreshing } ||
collections.any { it.folders.isNotEmpty() }
val isResolvingHeroSources = enabledAddons.any { it.isRefreshing } || homeUiState.isLoading
val showHeroSkeleton = showHeroSlot &&
val showHeroSkeleton = homeSettingsUiState.heroEnabled &&
enabledAddons.isNotEmpty() &&
homeUiState.heroItems.isEmpty() &&
isResolvingHeroSources
val showHeroSlot = homeSettingsUiState.heroEnabled && hasCurrentHeroSource &&
(homeUiState.heroItems.isNotEmpty() || showHeroSkeleton)
var firstCatalogReported by remember { mutableStateOf(false) }
LaunchedEffect(homeUiState.sections.firstOrNull()?.key, onFirstCatalogRendered) {
@ -749,14 +754,14 @@ fun HomeScreen(
) {
if (showHeroSlot) {
item {
when {
showHeroSkeleton -> HomeSkeletonHero(
if (showHeroSkeleton) {
HomeSkeletonHero(
modifier = Modifier,
viewportHeight = maxHeight,
mobileBelowSectionHeightHint = mobileHeroBelowSectionHeightHint,
)
homeUiState.heroItems.isNotEmpty() -> HomeHeroSection(
} else {
HomeHeroSection(
items = homeUiState.heroItems,
modifier = Modifier,
viewportHeight = maxHeight,
@ -764,12 +769,6 @@ fun HomeScreen(
listState = homeListState,
onItemClick = onPosterClick,
)
else -> HomeHeroReservedSpace(
modifier = Modifier,
viewportHeight = maxHeight,
mobileBelowSectionHeightHint = mobileHeroBelowSectionHeightHint,
)
}
}
}
@ -792,10 +791,31 @@ fun HomeScreen(
}
}
item {
val emptyStateModifier = if (
continueWatchingPreferences.isVisible && continueWatchingItems.isNotEmpty()
) {
Modifier.padding(horizontal = 16.dp)
} else {
Modifier
.fillParentMaxHeight()
.padding(horizontal = 16.dp)
}
HomeEmptyStateCard(
modifier = Modifier.padding(horizontal = 16.dp),
title = stringResource(Res.string.compose_search_empty_no_active_addons_title),
message = stringResource(Res.string.home_empty_no_active_addons_message),
modifier = emptyStateModifier,
title = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.addons_empty_title
} else {
Res.string.compose_search_empty_no_active_addons_title
},
),
message = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.addons_appstore_empty_subtitle
} else {
Res.string.home_empty_no_active_addons_message
},
),
)
}
}
@ -839,10 +859,22 @@ fun HomeScreen(
)
} else {
HomeEmptyStateCard(
modifier = Modifier.padding(horizontal = 16.dp),
title = stringResource(Res.string.home_empty_no_rows_title),
message = homeUiState.errorMessage
?: stringResource(Res.string.home_empty_no_rows_message),
modifier = Modifier
.fillParentMaxHeight()
.padding(horizontal = 16.dp),
title = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.store_empty_unavailable_title
} else {
Res.string.home_empty_no_rows_title
},
),
message = if (AppFeaturePolicy.storeNarrativeEnabled) {
stringResource(Res.string.store_empty_unavailable_message)
} else {
homeUiState.errorMessage
?: stringResource(Res.string.home_empty_no_rows_message)
},
)
}
}

View file

@ -1,41 +1,25 @@
package com.nuvio.app.features.home.components
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.nuvio.app.core.ui.NuvioPrimaryButton
import com.nuvio.app.core.ui.NuvioSurfaceCard
import androidx.compose.ui.graphics.painter.Painter
import com.nuvio.app.core.ui.NuvioEmptyState
@Composable
fun HomeEmptyStateCard(
title: String,
message: String,
modifier: Modifier = Modifier,
iconPainter: Painter? = null,
actionLabel: String? = null,
onActionClick: (() -> Unit)? = null,
) {
NuvioSurfaceCard(modifier = modifier) {
Text(
text = title,
style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onSurface,
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = message,
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
if (actionLabel != null && onActionClick != null) {
Spacer(modifier = Modifier.height(16.dp))
NuvioPrimaryButton(
text = actionLabel,
onClick = onActionClick,
)
}
}
NuvioEmptyState(
modifier = modifier,
title = title,
message = message,
iconPainter = iconPainter,
actionLabel = actionLabel,
onActionClick = onActionClick,
)
}

View file

@ -84,6 +84,7 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.launch
import nuvio.composeapp.generated.resources.*
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
@Composable
@ -268,7 +269,10 @@ fun LibraryScreen(
)
} else {
HomeEmptyStateCard(
modifier = Modifier.padding(horizontal = 16.dp),
modifier = Modifier
.fillParentMaxHeight(0.55f)
.padding(horizontal = 16.dp),
iconPainter = painterResource(Res.drawable.sidebar_library),
title = if (isTraktSource) {
stringResource(Res.string.library_trakt_load_failed)
} else {
@ -292,7 +296,10 @@ fun LibraryScreen(
)
} else {
HomeEmptyStateCard(
modifier = Modifier.padding(horizontal = 16.dp),
modifier = Modifier
.fillParentMaxHeight(0.55f)
.padding(horizontal = 16.dp),
iconPainter = painterResource(Res.drawable.sidebar_library),
title = if (isTraktSource) {
stringResource(Res.string.library_trakt_empty_title)
} else {
@ -345,7 +352,10 @@ private fun LazyListScope.cloudLibraryContent(
!uiState.isEnabled -> {
item {
HomeEmptyStateCard(
modifier = Modifier.padding(horizontal = 16.dp),
modifier = Modifier
.fillParentMaxHeight(0.55f)
.padding(horizontal = 16.dp),
iconPainter = painterResource(Res.drawable.sidebar_library),
title = stringResource(Res.string.cloud_library_disabled_title),
message = stringResource(Res.string.cloud_library_disabled_message),
actionLabel = stringResource(Res.string.cloud_library_disabled_action),
@ -357,7 +367,10 @@ private fun LazyListScope.cloudLibraryContent(
!uiState.hasConnectedProvider -> {
item {
HomeEmptyStateCard(
modifier = Modifier.padding(horizontal = 16.dp),
modifier = Modifier
.fillParentMaxHeight(0.55f)
.padding(horizontal = 16.dp),
iconPainter = painterResource(Res.drawable.sidebar_library),
title = stringResource(Res.string.cloud_library_connect_title),
message = stringResource(Res.string.cloud_library_connect_message),
actionLabel = stringResource(Res.string.cloud_library_connect_action),
@ -407,6 +420,7 @@ private fun LazyListScope.cloudLibraryContent(
item(key = "cloud-error-${providerState.providerId}") {
HomeEmptyStateCard(
modifier = Modifier.padding(horizontal = 16.dp),
iconPainter = painterResource(Res.drawable.sidebar_library),
title = stringResource(Res.string.cloud_library_load_failed, providerState.providerName),
message = providerState.errorMessage.orEmpty(),
actionLabel = stringResource(Res.string.action_retry),
@ -420,7 +434,10 @@ private fun LazyListScope.cloudLibraryContent(
} else if (filteredItems.isEmpty()) {
item {
HomeEmptyStateCard(
modifier = Modifier.padding(horizontal = 16.dp),
modifier = Modifier
.fillParentMaxHeight(0.5f)
.padding(horizontal = 16.dp),
iconPainter = painterResource(Res.drawable.sidebar_library),
title = stringResource(Res.string.cloud_library_empty_title),
message = stringResource(Res.string.cloud_library_empty_message),
actionLabel = stringResource(Res.string.action_retry),

View file

@ -31,6 +31,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil3.compose.AsyncImage
import com.nuvio.app.core.build.AppFeaturePolicy
import com.nuvio.app.core.network.NetworkCondition
import com.nuvio.app.core.format.formatReleaseDateForDisplay
import com.nuvio.app.core.ui.NuvioDropdownChip
@ -94,7 +95,9 @@ internal fun LazyListScope.discoverContent(
items(2) {
DiscoverSkeletonRow(
columns = columns,
modifier = Modifier.padding(horizontal = 16.dp),
modifier = Modifier
.fillParentMaxHeight(0.72f)
.padding(horizontal = 16.dp),
)
}
}
@ -353,13 +356,37 @@ private fun DiscoverEmptyStateCard(
when (reason) {
DiscoverEmptyStateReason.NoActiveAddons -> {
title = stringResource(Res.string.compose_search_empty_no_active_addons_title)
message = stringResource(Res.string.discover_empty_no_active_addons_message)
title = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.addons_empty_title
} else {
Res.string.compose_search_empty_no_active_addons_title
},
)
message = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.addons_appstore_empty_subtitle
} else {
Res.string.discover_empty_no_active_addons_message
},
)
}
DiscoverEmptyStateReason.NoDiscoverCatalogs -> {
title = stringResource(Res.string.discover_empty_no_catalogs_title)
message = stringResource(Res.string.discover_empty_no_catalogs_message)
title = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.store_empty_unavailable_title
} else {
Res.string.discover_empty_no_catalogs_title
},
)
message = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.store_empty_unavailable_message
} else {
Res.string.discover_empty_no_catalogs_message
},
)
}
DiscoverEmptyStateReason.RequestFailed -> {

View file

@ -40,6 +40,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.nuvio.app.core.build.AppFeaturePolicy
import com.nuvio.app.core.network.NetworkCondition
import com.nuvio.app.core.network.NetworkStatusRepository
import com.nuvio.app.core.ui.NuvioInputField
@ -64,6 +65,8 @@ import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.addons_appstore_empty_subtitle
import nuvio.composeapp.generated.resources.addons_empty_title
import nuvio.composeapp.generated.resources.compose_nav_search
import nuvio.composeapp.generated.resources.compose_search_clear
import nuvio.composeapp.generated.resources.compose_search_discover_title
@ -78,6 +81,8 @@ import nuvio.composeapp.generated.resources.compose_search_empty_no_search_catal
import nuvio.composeapp.generated.resources.compose_search_placeholder
import nuvio.composeapp.generated.resources.compose_search_recent_searches
import nuvio.composeapp.generated.resources.compose_search_remove_recent_search
import nuvio.composeapp.generated.resources.store_empty_unavailable_message
import nuvio.composeapp.generated.resources.store_empty_unavailable_title
import org.jetbrains.compose.resources.stringResource
@Composable
@ -317,7 +322,9 @@ fun SearchScreen(
isWaitingForSearch -> {
items(2) {
HomeSkeletonRow(
modifier = Modifier.padding(horizontal = homeSectionPadding),
modifier = Modifier
.fillParentMaxHeight()
.padding(horizontal = homeSectionPadding),
showHeaderAccent = !homeCatalogSettingsUiState.hideCatalogUnderline,
)
}
@ -413,13 +420,37 @@ private fun SearchEmptyStateCard(
when (reason) {
SearchEmptyStateReason.NoActiveAddons -> {
title = stringResource(Res.string.compose_search_empty_no_active_addons_title)
message = stringResource(Res.string.compose_search_empty_no_active_addons_message)
title = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.addons_empty_title
} else {
Res.string.compose_search_empty_no_active_addons_title
},
)
message = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.addons_appstore_empty_subtitle
} else {
Res.string.compose_search_empty_no_active_addons_message
},
)
}
SearchEmptyStateReason.NoSearchCatalogs -> {
title = stringResource(Res.string.compose_search_empty_no_search_catalogs_title)
message = stringResource(Res.string.compose_search_empty_no_search_catalogs_message)
title = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.store_empty_unavailable_title
} else {
Res.string.compose_search_empty_no_search_catalogs_title
},
)
message = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.store_empty_unavailable_message
} else {
Res.string.compose_search_empty_no_search_catalogs_message
},
)
}
SearchEmptyStateReason.RequestFailed -> {

View file

@ -19,14 +19,20 @@ internal fun LazyListScope.contentDiscoveryContent(
) {
item {
SettingsSection(
title = stringResource(Res.string.settings_content_discovery_section_sources),
title = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.compose_settings_page_addons
} else {
Res.string.settings_content_discovery_section_sources
},
),
isTablet = isTablet,
) {
SettingsGroup(isTablet = isTablet) {
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_addons),
description = stringResource(
if (AppFeaturePolicy.personalMediaAddonCopyEnabled) {
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.settings_content_discovery_addons_description_appstore
} else {
Res.string.settings_content_discovery_addons_description

View file

@ -31,6 +31,7 @@ import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.nuvio.app.core.build.AppFeaturePolicy
import com.nuvio.app.core.ui.NuvioActionLabel
import com.nuvio.app.core.ui.NuvioToastController
import com.nuvio.app.features.home.HomeCatalogSettingsItem
@ -58,6 +59,8 @@ import nuvio.composeapp.generated.resources.settings_homescreen_show_hero
import nuvio.composeapp.generated.resources.settings_homescreen_show_hero_description
import nuvio.composeapp.generated.resources.settings_homescreen_summary
import nuvio.composeapp.generated.resources.settings_homescreen_summary_hint
import nuvio.composeapp.generated.resources.store_empty_unavailable_message
import nuvio.composeapp.generated.resources.store_empty_unavailable_title
import org.jetbrains.compose.resources.stringResource
import sh.calvin.reorderable.ReorderableCollectionItemScope
import sh.calvin.reorderable.ReorderableItem
@ -133,9 +136,23 @@ internal fun LazyListScope.homescreenSettingsContent(
item {
if (items.isEmpty()) {
HomeEmptyStateCard(
modifier = Modifier.fillMaxWidth(),
title = stringResource(Res.string.settings_homescreen_empty_title),
message = stringResource(Res.string.settings_homescreen_empty_message),
modifier = Modifier
.fillMaxWidth()
.heightIn(min = 280.dp),
title = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.store_empty_unavailable_title
} else {
Res.string.settings_homescreen_empty_title
},
),
message = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.store_empty_unavailable_message
} else {
Res.string.settings_homescreen_empty_message
},
),
)
} else {
val catalogCount = items.count { !it.isCollection }

View file

@ -20,6 +20,7 @@ import androidx.compose.material3.Text
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.nuvio.app.core.build.AppFeaturePolicy
import com.nuvio.app.core.build.AppVersionConfig
import nuvio.composeapp.generated.resources.Res
import nuvio.composeapp.generated.resources.compose_about_made_with
@ -37,7 +38,9 @@ import nuvio.composeapp.generated.resources.compose_settings_root_appearance_des
import nuvio.composeapp.generated.resources.compose_settings_root_check_updates_description
import nuvio.composeapp.generated.resources.compose_settings_root_check_updates_title
import nuvio.composeapp.generated.resources.compose_settings_root_content_discovery_description
import nuvio.composeapp.generated.resources.compose_settings_root_content_discovery_description_appstore
import nuvio.composeapp.generated.resources.compose_settings_root_downloads_description
import nuvio.composeapp.generated.resources.compose_settings_root_downloads_description_appstore
import nuvio.composeapp.generated.resources.compose_settings_root_downloads_title
import nuvio.composeapp.generated.resources.compose_settings_root_general_section
import nuvio.composeapp.generated.resources.compose_settings_root_integrations_description
@ -130,7 +133,13 @@ internal fun LazyListScope.settingsRootContent(
SettingsGroupDivider(isTablet = isTablet)
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_content_discovery),
description = stringResource(Res.string.compose_settings_root_content_discovery_description),
description = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.compose_settings_root_content_discovery_description_appstore
} else {
Res.string.compose_settings_root_content_discovery_description
},
),
icon = Icons.Rounded.Extension,
isTablet = isTablet,
onClick = onContentDiscoveryClick,
@ -138,7 +147,13 @@ internal fun LazyListScope.settingsRootContent(
SettingsGroupDivider(isTablet = isTablet)
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_root_downloads_title),
description = stringResource(Res.string.compose_settings_root_downloads_description),
description = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.compose_settings_root_downloads_description_appstore
} else {
Res.string.compose_settings_root_downloads_description
},
),
icon = Icons.Rounded.CloudDownload,
isTablet = isTablet,
onClick = onDownloadsClick,

View file

@ -567,7 +567,7 @@ private fun MobileSettingsScreen(
pluginsEnabled = AppFeaturePolicy.pluginsEnabled,
supportersContributorsPageEnabled = AppFeaturePolicy.supportersContributorsPageEnabled,
accountDeletionEnabled = AppFeaturePolicy.accountDeletionEnabled,
personalMediaAddonCopyEnabled = AppFeaturePolicy.personalMediaAddonCopyEnabled,
storeNarrativeEnabled = AppFeaturePolicy.storeNarrativeEnabled,
liquidGlassNativeTabBarSupported = liquidGlassNativeTabBarSupported,
switchProfileAvailable = onSwitchProfile != null,
checkForUpdatesAvailable = onCheckForUpdatesClick != null,
@ -955,7 +955,7 @@ private fun TabletSettingsScreen(
pluginsEnabled = AppFeaturePolicy.pluginsEnabled,
supportersContributorsPageEnabled = AppFeaturePolicy.supportersContributorsPageEnabled,
accountDeletionEnabled = AppFeaturePolicy.accountDeletionEnabled,
personalMediaAddonCopyEnabled = AppFeaturePolicy.personalMediaAddonCopyEnabled,
storeNarrativeEnabled = AppFeaturePolicy.storeNarrativeEnabled,
liquidGlassNativeTabBarSupported = liquidGlassNativeTabBarSupported,
switchProfileAvailable = onSwitchProfile != null,
checkForUpdatesAvailable = onCheckForUpdatesClick != null,

View file

@ -8,6 +8,7 @@ import androidx.compose.animation.fadeIn
import androidx.compose.animation.slideInVertically
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.material.icons.Icons
@ -43,6 +44,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.nuvio.app.core.ui.NuvioTokens
import com.nuvio.app.core.ui.NuvioEmptyState
import com.nuvio.app.core.ui.nuvio
import com.nuvio.app.isIos
import nuvio.composeapp.generated.resources.*
@ -81,7 +83,7 @@ internal fun settingsSearchEntries(
pluginsEnabled: Boolean,
supportersContributorsPageEnabled: Boolean,
accountDeletionEnabled: Boolean,
personalMediaAddonCopyEnabled: Boolean,
storeNarrativeEnabled: Boolean,
liquidGlassNativeTabBarSupported: Boolean,
switchProfileAvailable: Boolean,
checkForUpdatesAvailable: Boolean,
@ -225,13 +227,25 @@ internal fun settingsSearchEntries(
page = SettingsPage.ContentDiscovery,
key = "content-discovery",
title = contentDiscoveryPage,
description = stringResource(Res.string.compose_settings_root_content_discovery_description),
description = stringResource(
if (storeNarrativeEnabled) {
Res.string.compose_settings_root_content_discovery_description_appstore
} else {
Res.string.compose_settings_root_content_discovery_description
},
),
icon = Icons.Rounded.Extension,
)
add(
key = "downloads",
title = downloadsPage,
description = stringResource(Res.string.compose_settings_root_downloads_description),
description = stringResource(
if (storeNarrativeEnabled) {
Res.string.compose_settings_root_downloads_description_appstore
} else {
Res.string.compose_settings_root_downloads_description
},
),
category = generalCategory,
icon = Icons.Rounded.CloudDownload,
target = SettingsSearchTarget.Downloads,
@ -448,7 +462,7 @@ internal fun settingsSearchEntries(
key = "addons",
title = addonsPage,
description = stringResource(
if (personalMediaAddonCopyEnabled) {
if (storeNarrativeEnabled) {
Res.string.settings_content_discovery_addons_description_appstore
} else {
Res.string.settings_content_discovery_addons_description
@ -1106,25 +1120,14 @@ private fun SettingsSearchField(
@Composable
private fun SettingsSearchEmptyState(isTablet: Boolean) {
val tokens = MaterialTheme.nuvio
SettingsSection(
title = stringResource(Res.string.settings_search_results_section),
isTablet = isTablet,
) {
SettingsGroup(isTablet = isTablet) {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = if (isTablet) 20.dp else 16.dp, vertical = 18.dp),
) {
Text(
text = stringResource(Res.string.settings_search_empty),
style = MaterialTheme.typography.bodyLarge,
color = tokens.colors.textPrimary,
fontWeight = FontWeight.Medium,
)
}
}
NuvioEmptyState(
modifier = Modifier.heightIn(min = 280.dp),
title = stringResource(Res.string.settings_search_empty),
)
}
}

View file

@ -41,7 +41,6 @@ import androidx.compose.material.icons.automirrored.rounded.OpenInNew
import androidx.compose.material.icons.rounded.ContentCopy
import androidx.compose.material.icons.rounded.Download
import androidx.compose.material.icons.rounded.Refresh
import androidx.compose.material.icons.rounded.SearchOff
import com.nuvio.app.core.ui.NuvioLoadingIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@ -75,6 +74,7 @@ import com.nuvio.app.core.build.AppFeaturePolicy
import com.nuvio.app.core.ui.NuvioBackButton
import com.nuvio.app.core.ui.NuvioBottomSheetActionRow
import com.nuvio.app.core.ui.NuvioBottomSheetDivider
import com.nuvio.app.core.ui.NuvioEmptyState
import com.nuvio.app.core.ui.NuvioModalBottomSheet
import com.nuvio.app.core.ui.NuvioToastController
import com.nuvio.app.core.ui.dismissNuvioBottomSheet
@ -892,7 +892,10 @@ internal fun StreamList(
!hasAnyStreams && !uiState.isAnyLoading -> {
item {
EmptyStateBlock(reason = uiState.emptyStateReason)
EmptyStateBlock(
reason = uiState.emptyStateReason,
modifier = Modifier.fillParentMaxHeight(),
)
}
}
@ -1249,13 +1252,37 @@ private fun EmptyStateBlock(
when (reason) {
StreamsEmptyStateReason.NoAddonsInstalled -> {
title = stringResource(Res.string.compose_search_empty_no_active_addons_title)
message = stringResource(Res.string.streams_empty_no_addons_message)
title = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.addons_empty_title
} else {
Res.string.compose_search_empty_no_active_addons_title
},
)
message = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.addons_appstore_empty_subtitle
} else {
Res.string.streams_empty_no_addons_message
},
)
}
StreamsEmptyStateReason.NoCompatibleAddons -> {
title = stringResource(Res.string.streams_empty_no_stream_addon_title)
message = stringResource(Res.string.streams_empty_no_stream_addon_message)
title = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.store_empty_unavailable_title
} else {
Res.string.streams_empty_no_stream_addon_title
},
)
message = stringResource(
if (AppFeaturePolicy.storeNarrativeEnabled) {
Res.string.store_empty_unavailable_message
} else {
Res.string.streams_empty_no_stream_addon_message
},
)
}
StreamsEmptyStateReason.StreamFetchFailed -> {
@ -1269,35 +1296,11 @@ private fun EmptyStateBlock(
}
}
Column(
modifier = modifier
.fillMaxWidth()
.padding(32.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
Icon(
imageVector = Icons.Rounded.SearchOff,
contentDescription = null,
modifier = Modifier.size(48.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f),
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = title,
style = MaterialTheme.typography.bodyLarge.copy(
fontSize = 16.sp,
fontWeight = FontWeight.SemiBold,
),
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
Text(
text = message,
style = MaterialTheme.typography.bodySmall.copy(fontSize = 14.sp),
color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.7f),
textAlign = TextAlign.Center,
)
}
NuvioEmptyState(
modifier = modifier,
title = title,
message = message,
)
}
@Composable

View file

@ -4,7 +4,7 @@ actual object AppFeaturePolicy {
actual val pluginsEnabled: Boolean = false
actual val supportersContributorsPageEnabled: Boolean = true
actual val accountDeletionEnabled: Boolean = false
actual val personalMediaAddonCopyEnabled: Boolean = false
actual val storeNarrativeEnabled: Boolean = false
actual val p2pEnabled: Boolean = false
actual val trailerPlaybackMode: TrailerPlaybackMode = TrailerPlaybackMode.EXTERNAL
actual val heroTrailerPlaybackSupported: Boolean = false

View file

@ -4,7 +4,7 @@ actual object AppFeaturePolicy {
actual val pluginsEnabled: Boolean = false
actual val supportersContributorsPageEnabled: Boolean = false
actual val accountDeletionEnabled: Boolean = true
actual val personalMediaAddonCopyEnabled: Boolean = true
actual val storeNarrativeEnabled: Boolean = true
actual val p2pEnabled: Boolean = false
actual val trailerPlaybackMode: TrailerPlaybackMode = TrailerPlaybackMode.EXTERNAL
actual val heroTrailerPlaybackSupported: Boolean = false

View file

@ -4,7 +4,7 @@ actual object AppFeaturePolicy {
actual val pluginsEnabled: Boolean = true
actual val supportersContributorsPageEnabled: Boolean = true
actual val accountDeletionEnabled: Boolean = false
actual val personalMediaAddonCopyEnabled: Boolean = false
actual val storeNarrativeEnabled: Boolean = false
actual val p2pEnabled: Boolean = false
actual val trailerPlaybackMode: TrailerPlaybackMode = TrailerPlaybackMode.IN_APP
actual val heroTrailerPlaybackSupported: Boolean = false

View file

@ -246,7 +246,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\nif [ -z \"$JAVA_HOME\" ] && [ -x \"/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home/bin/java\" ]; then\n export JAVA_HOME=\"/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home\"\nfi\nif [ -n \"$JAVA_HOME\" ]; then\n export PATH=\"$JAVA_HOME/bin:/opt/homebrew/bin:$PATH\"\nelse\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\nif [ -z \"$GRADLE_OPTS\" ]; then\n export GRADLE_OPTS=\"-Xmx12288M -Dfile.encoding=UTF-8 -XX:MaxMetaspaceSize=2048m\"\nfi\nif [ -z \"$KOTLIN_DAEMON_JVMARGS\" ]; then\n export KOTLIN_DAEMON_JVMARGS=\"-Xmx8192M\"\nfi\ncd \"$SRCROOT/..\"\n./gradlew :composeApp:embedAndSignAppleFrameworkForXcode\n";
shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\nexport JAVA_HOME=\"/Applications/Android Studio.app/Contents/jbr/Contents/Home\"\nexport PATH=\"$JAVA_HOME/bin:/opt/homebrew/bin:$PATH\"\nif [ -z \"$GRADLE_OPTS\" ]; then\n export GRADLE_OPTS=\"-Xmx12288M -Dfile.encoding=UTF-8 -XX:MaxMetaspaceSize=2048m\"\nfi\nif [ -z \"$KOTLIN_DAEMON_JVMARGS\" ]; then\n export KOTLIN_DAEMON_JVMARGS=\"-Xmx8192M\"\nfi\ncd \"$SRCROOT/..\"\n./gradlew :composeApp:embedAndSignAppleFrameworkForXcode\n";
};
/* End PBXShellScriptBuildPhase section */