diff --git a/composeApp/src/androidMain/res/xml/locale_config.xml b/composeApp/src/androidMain/res/xml/locale_config.xml
index 2badd023..180d60c4 100644
--- a/composeApp/src/androidMain/res/xml/locale_config.xml
+++ b/composeApp/src/androidMain/res/xml/locale_config.xml
@@ -1,13 +1,14 @@
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/composeApp/src/commonMain/composeResources/values-fr/strings.xml b/composeApp/src/commonMain/composeResources/values-fr/strings.xml
index 15301839..15b373b8 100644
--- a/composeApp/src/commonMain/composeResources/values-fr/strings.xml
+++ b/composeApp/src/commonMain/composeResources/values-fr/strings.xml
@@ -720,7 +720,7 @@
Pourcentage
Pourcentage de seuil
Afficher la carte de l'épisode suivant lorsque la lecture atteint ce pourcentage.
- %1$s%
+ %1$s %
Instantané
%1$ss
Illimité
@@ -1017,7 +1017,7 @@
Aucun lien direct du stream disponible
Aucune métadonnée disponible
Actualiser les streams
- Reprendre depuis %1$d%
+ Reprendre depuis %1$d %
Reprendre depuis %1$s
TAILLE %1$s
Fermer la bande-annonce
@@ -1027,7 +1027,7 @@
%1$s • %2$s
Échec de la vérification des mises à jour
Échec du téléchargement
- Téléchargement %1$d%%
+ Téléchargement %1$d %
Impossible de démarrer l'installation
Vous utilisez la version la plus récente.
Activez l'installation d'applications pour Nuvio puis revenez pour continuer.
diff --git a/composeApp/src/commonMain/composeResources/values-id/strings.xml b/composeApp/src/commonMain/composeResources/values-id/strings.xml
new file mode 100644
index 00000000..6f21bf11
--- /dev/null
+++ b/composeApp/src/commonMain/composeResources/values-id/strings.xml
@@ -0,0 +1,1277 @@
+
+ Sumber data, pengakuan, dan lisensi platform
+ Apresiasi terbuka dan kredit proyek
+ Kembali
+ Batal
+ Tutup
+ Hapus
+ Selesai
+ Edit
+ Impor
+ Berikutnya
+ OK
+ Putar
+ Sebelumnya
+ Hapus
+ Urutkan Ulang
+ Kembalikan ke Setelan Bawaan
+ Lanjutkan
+ Coba Lagi
+ Simpan
+ Menginstal
+ Addon
+ Aktif
+ %1$d katalog
+ Dapat Dikonfigurasi
+ Memperbarui
+ %1$d sumber
+ Tidak Tersedia
+ Konfigurasi addon
+ Hapus addon
+ Tambahkan URL manifes untuk mulai memuat katalog, metadata, streaming, atau subtitle ke Nuvio.
+ Belum ada addon yang terpasang.
+ Masukkan URL addon.
+ URL Addon
+ Pasang Addon
+ Memuat detail manifes...
+ Memvalidasi URL manifes dan memuat detail addon sebelum dipasang.
+ Memeriksa Addon
+ Pemasangan Gagal
+ %1$s berhasil divalidasi dan ditambahkan.
+ Addon Terpasang
+ Turunkan addon
+ Naikkan addon
+ Aktif
+ Addon
+ Katalog
+ Perbarui addon
+ Tambah Addon
+ Addon Terpasang
+ Ikhtisar
+ %1$d aturan id
+ Versi %1$s
+ Dipilih
+ Salin JSON
+ %1$d koleksi, %2$d folder
+ Hapus \"%1$s\"? Tindakan ini tidak dapat dibatalkan.
+ Hapus Koleksi
+ Tambah Katalog
+ Tambah Folder
+ Semua genre
+ Tambahkan katalog dari addon yang terpasang untuk menentukan apa yang ditampilkan folder ini.
+ Belum ada sumber katalog
+ Pilih
+ Emoji
+ URL Gambar
+ Tidak Ada
+ Sampul
+ Buat Koleksi
+ Selesai
+ Edit Koleksi
+ Edit Folder
+ Atur identitas, tampilan, dan sumber katalog folder dengan struktur yang sama seperti editor koleksi utama.
+ Tambahkan satu untuk memulai.
+ Belum ada folder
+ Folder
+ Filter Genre
+ Hanya tampilkan gambar sampul
+ Sembunyikan Judul
+ Folder Baru
+ Tampilkan koleksi ini di atas semua katalog beranda biasa. Beberapa koleksi yang disematkan mengikuti urutan pembuatan koleksi.
+ Sematkan di Atas Katalog
+ URL gambar latar (opsional)
+ Nama folder
+ URL GIF animasi (diputar hanya saat difokuskan)
+ Nama koleksi
+ Simpan Perubahan
+ Simpan
+ Tampilan
+ Dasar
+ Sumber Katalog
+ Pilih katalog addon yang akan diagregasi oleh folder ini.
+ Pilih Katalog
+ Pilih genre
+ %1$d dipilih
+ %1$d katalog
+ %1$d dipilih
+ Poster
+ Kotak
+ Lebar
+ Gabungkan semua katalog ke dalam satu tab
+ Tampilkan Tab \"Semua\"
+ Putar GIF yang dikonfigurasi sebagai pengganti sampul statis jika tersedia.
+ Tampilkan GIF Jika Dikonfigurasi
+ %1$d sumber · %2$s
+ Bentuk Tile
+ Baris
+ Tab
+ Mode Tampilan
+ Sumber TMDB
+ Daftar Publik
+ Produksi
+ Jaringan
+ Koleksi
+ Orang
+ Sutradara
+ Kustom
+ Pilih sumber yang sudah jadi. Anda dapat mengedit atau menghapusnya setelah ditambahkan.
+ Tempelkan URL daftar TMDB publik atau hanya angka dari URL tersebut.
+ Cari berdasarkan nama studio, atau tempelkan ID/URL perusahaan TMDB dan tambahkan langsung.
+ Masukkan ID jaringan. Jaringan umum tersedia di Preset dan filter cepat.
+ Cari nama koleksi film atau tempelkan ID koleksi dari TMDB.
+ Masukkan ID atau URL orang TMDB untuk membuat baris dari kredit pemeran.
+ Masukkan ID atau URL orang TMDB untuk membuat baris dari kredit sutradara.
+ Buat baris TMDB langsung menggunakan filter opsional. Kosongkan kolom yang tidak diperlukan.
+ Daftar TMDB publik
+ ID Jaringan
+ ID Koleksi
+ ID Orang
+ Nama, ID, atau URL perusahaan produksi
+ ID atau URL TMDB
+ https://www.themoviedb.org/list/8504994 atau 8504994
+ 213 untuk Netflix, 49 untuk HBO, 2739 untuk Disney+
+ 10 untuk Koleksi Star Wars
+ Marvel Studios, 420, atau URL perusahaan
+ 31 untuk Tom Hanks, atau URL orang
+ Contoh: Marvel Studios, 420, atau https://www.themoviedb.org/company/420.
+ Contoh: Star Wars Collection, Harry Potter Collection, atau URL koleksi.
+ Contoh ID: Netflix 213, HBO 49, Disney+ 2739.
+ Contoh: https://www.themoviedb.org/list/8504994 atau 8504994.
+ Contoh: https://www.themoviedb.org/person/31-tom-hanks atau 31.
+ Judul tampilan
+ Ditampilkan sebagai nama baris/tab. Jika kosong, Nuvio akan membuatnya dari sumber.
+ Film Marvel, Netflix Originals, Pixar
+ Film Tom Hanks, Aktor Favorit
+ Film Christopher Nolan, Sutradara Favorit
+ Film Aksi Terbaik, Drama Korea, Animasi 2024
+ Hasil Pencarian
+ Koleksi TMDB
+ Perusahaan TMDB %1$d
+ Koleksi TMDB %1$d
+ Tipe
+ Film
+ Serial
+ Keduanya
+ Urutkan
+ Filter
+ Kosongkan kolom yang tidak diperlukan.
+ Genre cepat
+ Bahasa cepat
+ Negara cepat
+ Kata kunci cepat
+ Studio cepat
+ Jaringan cepat
+ ID Genre
+ Gunakan nomor genre TMDB. Pisahkan beberapa dengan koma untuk AND, atau garis vertikal untuk OR.
+ Tanggal rilis atau tayang dari
+ Tanggal rilis atau tayang sampai
+ Gunakan format YYYY-MM-DD, misalnya 2024-01-01.
+ Rating minimum
+ Rating maksimum
+ Rating TMDB dari 0 hingga 10. Contoh: 7.0.
+ Suara minimum
+ Gunakan ini untuk menghindari judul dengan suara rendah. Contoh: 100.
+ Bahasa asli
+ Gunakan kode bahasa dua huruf, misalnya en, ko, ja, hi.
+ Negara asal
+ Gunakan kode negara dua huruf, misalnya US, KR, JP, IN.
+ ID Kata Kunci
+ Gunakan nomor kata kunci TMDB. Chip cepat mengisi contoh umum.
+ 9715 untuk superhero
+ ID Perusahaan
+ Gunakan ID studio/perusahaan. Chip cepat mengisi contoh umum.
+ 420 untuk Marvel Studios
+ ID Jaringan
+ Hanya untuk serial. Gunakan ID jaringan seperti Netflix 213 atau HBO 49.
+ 213 untuk Netflix
+ Tahun
+ Gunakan tahun empat digit, misalnya 2024.
+ Preset
+ Cari
+ Tambah Sumber
+ Tambah Daftar Trakt
+ Edit Daftar Trakt
+ Daftar Trakt
+ Daftar Trakt
+ Cari judul, URL Trakt, atau ID daftar
+ Gunakan URL daftar Trakt publik atau ID daftar numerik, atau cari berdasarkan nama.
+ Tontonan Akhir Pekan, Pemenang Penghargaan
+ Hasil Pencarian
+ Daftar Tren
+ Daftar Populer
+ Arah
+ Naik
+ Turun
+ Urutan Daftar
+ Baru Ditambahkan
+ Judul
+ Dirilis
+ Durasi
+ Populer
+ Persentase
+ Suara
+ Aksi
+ Petualangan
+ Animasi
+ Komedi
+ Horor
+ Fiksi Ilmiah
+ Drama
+ Kejahatan
+ Reality
+ Inggris
+ Korea
+ Jepang
+ Hindi
+ Spanyol
+ Amerika Serikat
+ Korea
+ Jepang
+ India
+ Inggris Raya
+ Superhero
+ Berdasarkan Novel
+ Perjalanan Waktu
+ Luar Angkasa
+ Marvel
+ Disney
+ Pixar
+ Lucasfilm
+ Warner Bros.
+ Netflix
+ HBO
+ Disney+
+ Prime Video
+ Hulu
+ Asli
+ Populer
+ Nilai Tertinggi
+ Terbaru
+ Daftar TMDB
+ Koleksi Film TMDB
+ Produksi
+ Jaringan
+ Orang
+ Sutradara
+ Temukan TMDB
+ Buat satu untuk mengorganisir katalog Anda.
+ Belum ada koleksi
+ %1$d folder
+ Tidak ada item ditemukan
+ Folder tidak ditemukan
+ Koleksi
+ Impor Koleksi
+ JSON
+ Tempelkan JSON koleksi Anda di bawah ini.
+ Impor
+ Koleksi Baru
+ Disematkan
+ Semua
+ Koleksi Anda
+ Dibuat dengan ❤️ oleh Tapframe dan teman-teman
+ Versi %1$s (%2$s)
+ Nonaktif
+ Aktif
+ Jeda
+ Muat Ulang
+ Sudah punya akun?
+ Lanjutkan Tanpa Akun
+ Buat Akun
+ Belum punya akun?
+ Email
+ atau
+ Kata Sandi
+ Masuk untuk mengakses perpustakaan dan progres Anda
+ Masuk
+ Daftar untuk menyinkronkan data Anda di semua perangkat
+ Daftar
+ Data Anda hanya akan disimpan secara lokal
+ Streaming semua, di mana saja
+ Selamat Datang Kembali
+ Perpustakaan
+ Perpustakaan Trakt
+ Beranda
+ Perpustakaan
+ Profil
+ Pencarian
+ Trek Audio
+ Audio
+ Bawaan
+ Offset Bawah
+ Tutup pemutar
+ Warna
+ Sedang diputar
+ E%1$d
+ S%1$dE%2$d
+ S%1$dE%2$d • %3$s
+ Episode
+ Ukuran Font
+ %1$dsp
+ Kunci kontrol pemutar
+ Tidak ada trek audio tersedia
+ Tidak ada episode tersedia
+ Tidak ada stream ditemukan
+ Tidak Ada
+ Garis Tepi
+ Episode
+ Sumber
+ Stream
+ Kesalahan pemutaran
+ Memutar
+ Ketuk untuk mengambil subtitle
+ Kembali
+ Kembalikan ke Setelan Bawaan
+ Penuh
+ Sesuaikan
+ Perbesar
+ Mundur 10 detik
+ -%1$ds
+ +%1$ds
+ -%1$ds
+ +%1$ds
+ Maju 10 detik
+ Sumber
+ Gaya
+ Sub
+ Subtitle
+ Kecerahan %1$s
+ Volume %1$s
+ Dibisukan
+ Diunduh
+ Tayang
+ TBA
+ Ketuk untuk membuka kunci
+ Trek %1$d
+ Buka kunci kontrol pemutar
+ Sedang menonton
+ Tambah Profil
+ Hapus pencarian
+ Temukan
+ Addon yang terpasang gagal mengembalikan hasil pencarian yang valid.
+ Pencarian gagal
+ Pasang dan validasi setidaknya satu addon sebelum mencari.
+ Tidak ada addon aktif
+ Katalog yang dapat dicari tidak mengembalikan hasil untuk kueri ini.
+ Tidak ada hasil ditemukan
+ Addon yang terpasang tidak menyediakan pencarian katalog.
+ Tidak ada katalog yang dapat dicari
+ Cari film, acara...
+ Pencarian Terbaru
+ Hapus pencarian terbaru
+ Tentang
+ Umum
+ Akun
+ Addon
+ Tata Letak
+ Konten & Penemuan
+ Lanjutkan Menonton
+ Tata Letak Beranda
+ Integrasi
+ Lisensi & Atribusi
+ Rating MDBList
+ Halaman Detail
+ Notifikasi
+ Pemutaran
+ Plugin
+ Gaya Kartu Poster
+ Pengaturan
+ Pendukung & Kontributor
+ Pengayaan TMDB
+ Trakt
+ TENTANG
+ Status akun dan sinkronisasi
+ AKUN
+ Struktur beranda dan gaya poster
+ Unduh versi terbaru
+ Periksa pembaruan
+ Kelola addon dan sumber penemuan.
+ Kelola film dan episode yang telah diunduh.
+ Unduhan
+ UMUM
+ Kelola integrasi yang tersedia
+ Kelola peringatan rilis episode dan kirim notifikasi uji coba.
+ Beralih ke profil yang berbeda.
+ Ganti Profil
+ Buka layar koneksi Trakt
+ Tidak ada pengaturan ditemukan.
+ Cari pengaturan...
+ HASIL
+ LISENSI APLIKASI
+ DATA & LAYANAN
+ LISENSI PEMUTARAN
+ Nuvio Mobile
+ Kode sumber dan ketentuan lisensi tersedia di repositori proyek.
+ Dilisensikan di bawah GNU General Public License v3.0.
+ The Movie Database (TMDB)
+ Nuvio menggunakan API TMDB untuk metadata film dan TV, karya seni, trailer, pemeran, detail produksi, koleksi, dan rekomendasi. Produk ini menggunakan API TMDB tetapi tidak didukung atau disertifikasi oleh TMDB.
+ Dataset Non-Komersial IMDb
+ Nuvio menggunakan Dataset Non-Komersial IMDb, termasuk title.ratings.tsv.gz, untuk rating dan jumlah suara IMDb. Informasi disediakan oleh IMDb (https://www.imdb.com). Digunakan dengan izin. Data IMDb untuk penggunaan pribadi dan non-komersial sesuai ketentuan IMDb.
+ Trakt
+ Nuvio terhubung ke Trakt untuk autentikasi akun, riwayat tontonan, sinkronisasi progres, data perpustakaan, rating, daftar, dan komentar. Nuvio tidak berafiliasi atau didukung oleh Trakt.
+ MDBList
+ Nuvio menggunakan MDBList untuk rating dan data penyedia skor eksternal. Nuvio tidak berafiliasi atau didukung oleh MDBList.
+ IntroDB
+ Nuvio menggunakan API IntroDB untuk intro, rekap, kredit, dan pratinjau cap waktu yang disediakan komunitas yang digunakan oleh kontrol lewati. Nuvio tidak berafiliasi atau didukung oleh IntroDB.
+ MPVKit
+ Digunakan untuk pemutaran pada build iOS.
+ Sumber MPVKit saja dilisensikan di bawah LGPL v3.0. Bundle MPVKit, termasuk libmpv dan pustaka FFmpeg, juga dilisensikan di bawah LGPL v3.0.
+ AndroidX Media3 ExoPlayer 1.8.0
+ Digunakan untuk pemutaran pada build Android.
+ Dilisensikan di bawah Apache License, Versi 2.0.
+ Memuat daftar Trakt Anda…
+ Pilih tempat menyimpan judul ini di Trakt
+ Donasi
+ Lihat detail
+ Hapus
+ Mulai dari awal
+ Putar
+ %1$d/10
+ Ulasan
+ Spoiler
+ Belum ada ulasan Trakt tersedia.
+ %1$d suka
+ Komentar ini mengandung spoiler.
+ Komentar ini mengandung spoiler dan telah disembunyikan.
+ Komentar
+ Trailer
+ %1$s (%2$d)
+ Trailer
+ Tidak ada episode yang selesai diunduh
+ Belum ada unduhan
+ %1$d episode diunduh
+ Aktif
+ Film
+ Acara
+ Tampilkan Unduhan
+ Selesai • %1$s
+ Mengunduh • %1$s
+ Gagal
+ Dijeda • %1$s
+ Ditonton
+ Musim %1$d
+ Spesial
+ Lanjutkan dari tempat Anda berhenti
+ Tambah ke perpustakaan
+ Tandai sebagai belum ditonton
+ Tandai sebagai sudah ditonton
+ Hapus dari perpustakaan
+ Lihat Semua
+ Putar secara manual
+ Logo %1$s
+ Akun
+ Hapus Akun
+ Ini akan menghapus akun dan semua data terkait Anda secara permanen.
+ Tindakan ini tidak dapat dibatalkan. Semua data, profil, dan riwayat sinkronisasi Anda akan dihapus secara permanen.
+ Hapus Akun?
+ Email
+ Belum masuk
+ Keluar
+ Anda akan dikembalikan ke layar masuk.
+ Keluar?
+ Status
+ Anonim
+ Sudah masuk
+ Hitam AMOLED
+ Gunakan latar belakang hitam pekat untuk layar OLED.
+ Bahasa Aplikasi
+ Pilih Bahasa
+ Pengaturan untuk bagian Lanjutkan Menonton.
+ Liquid Glass
+ Gunakan tab bar iPhone asli di iOS 26 dan yang lebih baru. Pergantian profil instan dari tab bar tidak tersedia saat ini aktif.
+ Sesuaikan lebar kartu dan radius sudut.
+ TAMPILAN
+ BERANDA
+ TEMA
+ Koleksi • %1$s
+ Nama Tampilan
+ Pasang addon dengan katalog yang kompatibel untuk mengonfigurasi baris Beranda.
+ Tidak ada katalog beranda
+ Sumber hero
+ Tersembunyi
+ Pertahankan fokus Beranda
+ %1$s • Batas tercapai (maks %2$d)
+ Tidak ada sumber hero dipilih
+ Tidak di hero
+ Lepas sematkan ke atas dari koleksi untuk memindahkan
+ Disematkan
+ Disematkan ke atas
+ Urutkan Ulang
+ KATALOG
+ KATALOG & KOLEKSI
+ KOLEKSI
+ Tata Letak Beranda
+ Katalog Hero
+ %1$d dari %2$d dipilih
+ Tampilkan Bagian Hero
+ Tampilkan karousel hero di bagian atas beranda.
+ Sembunyikan Konten Belum Rilis
+ Sembunyikan film dan acara yang belum dirilis.
+ Sembunyikan Garis Bawah Katalog
+ Hapus garis aksen di bawah judul katalog dan koleksi di seluruh aplikasi.
+ %1$d dari %2$d katalog terlihat • %3$d sumber hero dipilih
+ Buka katalog hanya jika perlu mengganti nama atau mengurutkannya.
+ Terlihat
+ Sembunyikan nilai
+ Pemutar, subtitle, dan putar otomatis
+ Radius Sudut
+ Gaya Kartu Poster
+ Lebar
+ Kustom
+ Sesuaikan lebar kartu dan radius sudut.
+ Sembunyikan label
+ Poster Lanskap
+ Pratinjau Langsung
+ %1$s (%2$s)
+ Radius sudut: %1$ddp
+ Tinggi: %1$ddp
+ Lebar: %1$ddp
+ Klasik
+ Pil
+ Membulat
+ Tajam
+ Halus
+ Seimbang
+ Nyaman
+ Kompak
+ Padat
+ Besar
+ Standar
+ Tampilkan nilai
+ Tampilkan popup untuk melanjutkan dari tempat Anda berhenti saat membuka aplikasi setelah keluar dari pemutar.
+ Prompt lanjutkan saat dibuka
+ Buramkan thumbnail episode berikutnya di Lanjutkan Menonton untuk menghindari spoiler.
+ Buramkan yang Belum Ditonton di Lanjutkan Menonton
+ Sertakan episode mendatang di Lanjutkan Menonton sebelum tayang.
+ Tampilkan Episode Berikutnya yang Belum Tayang
+ URUTAN SORTIR
+ Urutan Sortir
+ Setelan Bawaan
+ Urutkan semua item berdasarkan yang terbaru
+ Gaya Streaming
+ Item yang sudah rilis lebih dulu, yang mendatang di akhir
+ Gaya Kartu Poster
+ SAAT DIBUKA
+ PERILAKU BERIKUTNYA
+ VISIBILITAS
+ Tampilkan rak Lanjutkan Menonton di Beranda.
+ Tampilkan Lanjutkan Menonton
+ Poster
+ Kartu poster yang mengutamakan karya seni
+ Lebar
+ Kartu horizontal padat informasi
+ Tampilkan episode berikutnya berdasarkan episode yang paling jauh ditonton. Nonaktifkan untuk menonton ulang agar menggunakan episode yang paling baru ditonton.
+ Berikutnya dari Episode Terjauh
+ Utamakan thumbnail episode jika tersedia.
+ Utamakan Thumbnail Episode di Lanjutkan Menonton
+ BERANDA
+ SUMBER
+ Pasang, hapus, perbarui, dan urutkan sumber konten Anda.
+ Pasang repositori scraper JavaScript dan uji penyedia secara internal.
+ Sesuaikan tata letak beranda, visibilitas konten, dan poster
+ Pengaturan untuk layar detail dan episode.
+ Buat pengelompokan katalog kustom dengan folder yang ditampilkan di Beranda.
+ Integrasi
+ Kontrol pengayaan metadata
+ Penyedia rating eksternal
+ Tambahkan kunci API MDBList Anda di bawah sebelum mengaktifkan rating.
+ Diperlukan untuk mengambil rating dari MDBList
+ Kunci API
+ Kunci API
+ Aktifkan Rating MDBList
+ Ambil rating dari penyedia eksternal di layar detail metadata
+ Kunci API
+ Penyedia rating eksternal
+ Rating MDBList
+ Tindakan
+ Kontrol putar dan simpan.
+ Pemeran
+ Daftar pemeran utama.
+ Latar Sinematik
+ Latar belakang buram di belakang konten, mirip dengan layar streaming.
+ Koleksi
+ Baris koleksi atau waralaba terkait.
+ Komentar
+ Ulasan dari Trakt
+ Detail
+ Durasi, status, rilis, bahasa, dan info terkait.
+ Kartu Episode
+ Pilih cara episode ditampilkan di layar metadata.
+ Horizontal
+ Kartu baris bergaya latar belakang
+ Daftar
+ Kartu bertumpuk yang mengutamakan detail
+ Episode
+ Musim dan daftar episode untuk serial.
+ Buramkan Episode Belum Ditonton
+ Buramkan thumbnail episode sampai ditonton untuk menghindari spoiler.
+ Grup %1$d
+ Lebih seperti ini
+ Latar rekomendasi TMDB di halaman detail
+ Tidak Ada
+ Ikhtisar
+ Sinopsis, rating, genre, dan kredit utama.
+ Produksi
+ Studio dan jaringan.
+ TAMPILAN
+ BAGIAN
+ Grup Tab %1$d
+ Tata Letak Tab
+ Kelompokkan bagian ke dalam tab seperti aplikasi TV. Tetapkan hingga 3 bagian per grup tab.
+ Trailer
+ Baris trailer dan pintasan pemutaran.
+ Notifikasi saat ini dinonaktifkan di Nuvio.
+ Peringatan rilis episode
+ Jadwalkan notifikasi lokal ketika episode baru untuk acara yang disimpan tersedia.
+ Notifikasi sistem dinonaktifkan untuk Nuvio. Aktifkan untuk menerima peringatan dan uji notifikasi.
+ %1$d peringatan rilis saat ini dijadwalkan di perangkat ini.
+ PERINGATAN
+ UJI COBA
+ Kirim Notifikasi Uji Coba
+ Mengirim Notifikasi Uji Coba...
+ Kirim notifikasi uji coba lokal untuk %1$s.
+ Simpan acara ke perpustakaan Anda terlebih dahulu untuk menguji notifikasi.
+ Notifikasi uji coba
+ Komunitas
+ Lihat orang-orang yang membangun dan mendukung Nuvio di Mobile, TV, dan Web.
+ API Pendukung tidak dikonfigurasi. Tambahkan DONATIONS_BASE_URL ke local.properties.
+ Kontributor
+ Pendukung
+ Buka GitHub
+ Profil GitHub tidak tersedia
+ Tidak ada pesan terlampir.
+ Memuat kontributor...
+ Memuat pendukung...
+ Gagal memuat kontributor
+ Gagal memuat pendukung
+ Tidak ada kontributor ditemukan.
+ Tidak ada pendukung ditemukan.
+ Tidak dapat memuat kontributor.
+ Tidak dapat memuat pendukung.
+ Tidak dapat memuat kontributor saat ini.
+ Tidak dapat memuat pendukung saat ini.
+ %1$d total commit
+ Jan
+ Feb
+ Mar
+ Apr
+ Mei
+ Jun
+ Jul
+ Agu
+ Sep
+ Okt
+ Nov
+ Des
+ %1$s %2$s, %3$s
+ Semua addon terpasang
+ Semua plugin yang diaktifkan
+ Addon yang Diizinkan
+ Plugin yang Diizinkan
+ Anime Skip
+ ID Klien AnimeSkip
+ Masukkan ID klien API AnimeSkip Anda. Dapatkan di anime-skip.com.
+ Aktifkan Pengiriman Intro
+ Tampilkan tombol untuk mengirim cap waktu intro/outro ke database komunitas.
+ Kunci API IntroDB
+ Masukkan kunci API IntroDB Anda untuk mengirim cap waktu. Diperlukan untuk pengiriman.
+ Juga cari AnimeSkip untuk cap waktu lewati (memerlukan ID klien).
+ Putar Otomatis Episode Berikutnya
+ Mulai episode berikutnya secara otomatis ketika prompt muncul.
+ Hanya dekoder perangkat
+ Utamakan dekoder aplikasi (FFmpeg)
+ Utamakan dekoder perangkat
+ Prioritas Dekoder
+ Ketuk di luar untuk menutup
+ Ketuk di luar untuk menyimpan & menutup
+ %1$d hari
+ %1$d hari
+ %1$d jam
+ %1$d jam
+ Gunakan libass untuk subtitle ASS/SSA
+ Eksperimental: rendering ASS/SSA lanjutan (gaya, posisi, animasi)
+ Kecepatan Putar saat Ditahan
+ Tahan untuk Mempercepat
+ Tekan lama di mana saja pada permukaan pemutar untuk sementara meningkatkan kecepatan putar.
+ Pola regex tidak valid
+ Durasi Cache Tautan Terakhir
+ DV7 - Fallback HEVC
+ Petakan Dolby Vision Profil 7 ke HEVC standar untuk perangkat tanpa dukungan hardware DV
+ Menit Ambang Batas
+ Cadangan ketika tidak ada cap waktu outro.
+ %1$s mnt
+ Tidak ada item tersedia
+ Belum diatur
+ Setelan Bawaan (file media)
+ Bahasa perangkat
+ Paksa
+ Tidak Ada
+ Utamakan Grup Binge (Episode Berikutnya)
+ Coba profil sumber yang sama terlebih dahulu (addon/grup kualitas yang sama) sebelum aturan putar otomatis normal.
+ Bahasa Audio yang Diutamakan
+ Bahasa yang Diutamakan
+ Preset
+ Mencocokkan dengan nama/judul/deskripsi/addon/url stream. Contoh: 4K|2160p|Remux
+ Pola Regex
+ Tidak ada pola yang diatur. Contoh: 4K|2160p|Remux
+ 1080p ke atas
+ AVC / x264
+ Kualitas BluRay
+ Dolby Atmos / DTS
+ Inggris
+ HDR / Dolby Vision
+ HEVC / x265
+ Tanpa CAM/TS
+ Tanpa REMUX/HDR
+ 1080p Standar
+ 4K / Remux
+ 720p / Lebih Kecil
+ Sumber WEB
+ Mode Render Libass
+ Cues Standar
+ Effects Canvas
+ Effects OpenGL
+ Overlay Canvas
+ Overlay OpenGL (Direkomendasikan)
+ Gunakan Ulang Tautan Terakhir
+ Putar otomatis stream terakhir yang berfungsi untuk film/episode yang sama ketika cache masih valid
+ Bahasa Audio Sekunder
+ Bahasa yang Diutamakan Sekunder
+ DEKODER
+ EPISODE BERIKUTNYA
+ PEMUTAR
+ LEWATI SEGMEN
+ PUTAR OTOMATIS STREAM
+ PEMILIHAN STREAM
+ SUBTITLE DAN AUDIO
+ RENDERING SUBTITLE
+ %1$d dipilih
+ Overlay Pemuatan
+ Tampilkan layar pemuatan sampai frame video pertama muncul.
+ Lewati Intro
+ Gunakan introdb.app untuk mendeteksi intro dan rekap.
+ Cakupan Sumber Putar Otomatis
+ Semua addon terpasang
+ Putar otomatis hanya mempertimbangkan stream dari addon yang terpasang.
+ Semua sumber
+ Putar otomatis dapat menggunakan addon terpasang maupun plugin yang diaktifkan.
+ Hanya plugin yang diaktifkan
+ Putar otomatis hanya mempertimbangkan stream dari plugin yang diaktifkan.
+ Hanya addon terpasang
+ Putar otomatis hanya mempertimbangkan stream dari addon yang terpasang.
+ Pemilihan Stream Otomatis
+ Putar otomatis sumber pertama
+ Putar sumber yang tersedia pertama secara otomatis.
+ Manual (pilih stream)
+ Selalu tampilkan daftar sumber dan biarkan saya memilih.
+ Putar otomatis cocokkan regex
+ Putar sumber pertama yang teksnya cocok dengan pola regex Anda.
+ Batas Waktu Pemilihan Stream
+ Waktu tunggu addon sebelum memilih.
+ Menit Ambang Batas
+ Mode Ambang Batas Episode Berikutnya
+ Menit sebelum selesai
+ Persentase
+ Persentase Ambang Batas
+ Cadangan ketika tidak ada cap waktu outro.
+ %1$s%
+ Instan
+ %1$sd
+ Tak Terbatas
+ Pemutaran Tunneled
+ Sinkronisasi audio/video tingkat hardware. Dapat meningkatkan pemutaran di beberapa perangkat Android TV
+ Tambahkan kunci API TMDB Anda sendiri di bawah sebelum mengaktifkan pengayaan.
+ Kunci API
+ Aktifkan Pengayaan TMDB
+ Gunakan TMDB sebagai sumber metadata untuk meningkatkan data addon
+ Masukkan kunci API v3 TMDB Anda.
+ Kode bahasa
+ Gambar
+ Gambar logo dan latar dari TMDB
+ Info Dasar
+ Deskripsi, genre, dan rating dari TMDB
+ Koleksi
+ Koleksi film TMDB dalam urutan rilis
+ Kredit
+ Pemeran dengan foto, sutradara, dan penulis dari TMDB
+ Detail
+ Durasi, status, negara, dan bahasa dari TMDB
+ Episode
+ Judul episode, ikhtisar, thumbnail, dan durasi dari TMDB
+ Yang Seperti Ini
+ Latar rekomendasi TMDB di halaman detail
+ Jaringan
+ Jaringan dengan logo dari TMDB
+ Produksi
+ Perusahaan produksi dari TMDB
+ Poster Musim
+ Gunakan poster musim TMDB di pemilih musim layar metadata untuk serial.
+ Trailer
+ Kandidat trailer dari video TMDB untuk bagian trailer detail
+ Kunci API pribadi
+ Bahasa
+ Bahasa metadata TMDB untuk judul, logo, dan kolom yang diaktifkan
+ KREDENSIAL
+ LOKALISASI
+ MODUL
+ Pengayaan TMDB
+ Setelah disetujui, Anda akan diarahkan kembali secara otomatis.
+ AUTENTIKASI
+ Komentar
+ Tampilkan ulasan Trakt di halaman metadata
+ Hubungkan Trakt
+ Terhubung sebagai %1$s
+ Pengguna Trakt
+ Putuskan Koneksi
+ Gagal membuka browser
+ FITUR
+ Selesaikan masuk Trakt di browser Anda
+ Sinkronkan daftar tonton, progres menonton, lanjutkan menonton, scrobble, dan daftar pribadi Anda dengan Trakt.
+ Kredensial Trakt hilang di local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET).
+ Buka Login Trakt
+ Anda sekarang dapat menyimpan ke daftar tonton Trakt dan personal.
+ Masuk dengan Trakt untuk mengaktifkan penyimpanan berbasis daftar dan mode perpustakaan Trakt.
+ Sumber Perpustakaan
+ Pilih perpustakaan mana yang digunakan untuk menyimpan dan melihat koleksi Anda
+ Sumber Perpustakaan
+ Pilih tempat menyimpan dan mengelola item perpustakaan Anda
+ Trakt
+ Perpustakaan Nuvio
+ Perpustakaan Trakt dipilih
+ Perpustakaan Nuvio dipilih
+ Progres Menonton
+ Pilih sumber progres mana yang digunakan untuk melanjutkan menonton
+ Progres Menonton
+ Pilih apakah resume dan lanjutkan menonton harus menggunakan Trakt atau Nuvio Sync sementara scrobbling Trakt tetap aktif.
+ Trakt
+ Nuvio Sync
+ Sumber progres menonton diatur ke Trakt
+ Sumber progres menonton diatur ke Nuvio Sync
+ Jendela Lanjutkan Menonton
+ Lanjutkan menonton berdasarkan riwayat Trakt
+ Jendela Lanjutkan Menonton
+ Pilih berapa banyak aktivitas Trakt yang harus muncul di lanjutkan menonton.
+ Semua riwayat
+ %1$d hari
+ Skor Penonton
+ IMDb
+ Letterboxd
+ Metacritic
+ Rotten Tomatoes
+ TMDB
+ Trakt
+ Tidak Diketahui
+ Amber
+ Delima
+ Zamrud
+ Samudra
+ Mawar
+ Lavender
+ Melati
+ Episode Berikutnya
+ Mencari sumber…
+ Memutar melalui %1$s dalam %2$d…
+ Thumbnail episode berikutnya
+ Belum Tayang
+ Lewati
+ Lewati Intro
+ Lewati Outro
+ Lewati Rekap
+ Tidak ada subtitle ditemukan
+ Afrikaans
+ Albania
+ Amharik
+ Arab
+ Armenia
+ Azerbaijan
+ Basque
+ Belarusia
+ Bengali
+ Bosnia
+ Bulgaria
+ Burma
+ Katalan
+ Tiongkok
+ Tiongkok (Sederhana)
+ Tiongkok (Tradisional)
+ Kroasia
+ Ceko
+ Denmark
+ Belanda
+ Inggris
+ Estonia
+ Filipina
+ Finlandia
+ Prancis
+ Galisia
+ Georgia
+ Jerman
+ Yunani
+ Gujarati
+ Ibrani
+ Hindi
+ Hungaria
+ Islandia
+ Indonesia
+ Irlandia
+ Italia
+ Jepang
+ Kannada
+ Kazakh
+ Khmer
+ Korea
+ Lao
+ Latvia
+ Lituania
+ Makedonia
+ Melayu
+ Malayalam
+ Malta
+ Marathi
+ Mongolia
+ Nepali
+ Norwegia
+ Persia
+ Polandia
+ Portugis (Portugal)
+ Portugis (Brasil)
+ Punjabi
+ Rumania
+ Rusia
+ Serbia
+ Sinhala
+ Slovak
+ Slovenia
+ Spanyol
+ Spanyol (Amerika Latin)
+ Swahili
+ Swedia
+ Tamil
+ Telugu
+ Thai
+ Turki
+ Ukraina
+ Urdu
+ Uzbek
+ Vietnam
+ Welsh
+ Zulu
+ Hapus
+ Lanjutkan
+ Abaikan
+ Pasang
+ Nanti
+ Tidak
+ Perbarui
+ Ya
+ Apakah Anda ingin keluar dari aplikasi?
+ Keluar dari aplikasi
+ Katalog ini tidak mengembalikan item apa pun.
+ Tidak ada judul ditemukan
+ Periksa koneksi Wi-Fi atau data seluler Anda dan coba lagi.
+ Sutradara
+ Gagal memuat
+ Lebih Seperti Ini
+ Musim
+ Addon ini mengembalikan video untuk serial, tetapi tidak ada yang menyertakan nomor musim atau episode.
+ Addon ini tidak menyediakan metadata episode untuk serial ini.
+ Episode belum dipublikasikan oleh addon ini.
+ Perangkat Anda terhubung, tetapi Nuvio tidak dapat menjangkau server yang diperlukan.
+ Tampilkan Lebih Sedikit
+ Tampilkan Lebih Banyak ▾
+ Penulis
+ Semua Genre
+ Katalog
+ %1$s • %2$s
+ Katalog yang dipilih gagal mengembalikan item temuan.
+ Tidak dapat memuat temuan
+ Addon yang terpasang tidak mengekspos katalog yang kompatibel untuk temuan.
+ Tidak ada katalog temuan
+ Katalog dan filter yang dipilih tidak mengembalikan item apa pun.
+ Tidak ada judul ditemukan
+ Pasang dan validasi setidaknya satu addon sebelum menelusuri katalog temuan.
+ Pilih Katalog
+ Pilih Genre
+ Pilih Tipe
+ Tipe
+ Tandai sebelumnya sebagai belum ditonton
+ Tandai sebelumnya sebagai sudah ditonton
+ Tandai %1$s sebagai belum ditonton
+ Tandai %1$s sebagai sudah ditonton
+ Tandai sebagai belum ditonton
+ Tandai sebagai sudah ditonton
+ Berikutnya
+ %1$s ditonton
+ Pasang dan validasi setidaknya satu addon sebelum memuat baris katalog di Beranda.
+ Addon yang terpasang saat ini tidak mengekspos katalog yang kompatibel tanpa tambahan yang diperlukan.
+ Tidak ada baris beranda tersedia
+ Lihat Detail
+ Kontrol putar dan simpan.
+ Tindakan
+ Daftar pemeran utama.
+ Baris koleksi atau waralaba terkait.
+ Koleksi
+ Bagian komentar Trakt.
+ Durasi, status, rilis, bahasa, dan info terkait.
+ Detail
+ Musim dan daftar episode untuk serial.
+ Baris rekomendasi.
+ Lebih Seperti Ini
+ Sinopsis, rating, genre, dan kredit utama.
+ Ikhtisar
+ Studio dan jaringan.
+ Produksi
+ Baris trailer dan pintasan pemutaran.
+ Kembali online
+ Tidak dapat menjangkau server
+ Tidak ada koneksi internet
+ (usia %1$d)
+ Lahir %1$s%2$s
+ Meninggal %1$s
+ Dikenal karena: %1$s
+ Terbaru
+ Tidak dapat memuat detail untuk %1$s
+ Populer
+ Terjadi kesalahan
+ Mendatang
+ Hapus
+ Batal
+ Masukkan PIN
+ Masukkan PIN untuk %1$s
+ Lupa PIN?
+ PIN salah
+ Dikunci. Coba lagi dalam %1$dd
+ Pilihan avatar akan muncul di sini saat katalog dimuat.
+ Avatar: %1$s
+ Masukkan URL gambar http:// atau https:// yang valid.
+ Pilih avatar
+ Pilih avatar di bawah ini.
+ Buat Profil
+ URL avatar kustom dipilih.
+ URL avatar kustom
+ Tempelkan tautan gambar, atau kosongkan untuk menggunakan katalog avatar bawaan.
+ https://example.com/avatar.png
+ Semua data untuk \"%1$s\" akan dihapus secara permanen.
+ Hapus Profil
+ Tambah Profil
+ Edit Profil
+ Masukkan PIN saat ini
+ Masukkan PIN baru
+ Profil %1$d
+ Memuat avatar...
+ Kelola Profil
+ Nama profil
+ Profil baru
+ Addon utama nonaktif
+ Addon utama aktif
+ Hapus PIN untuk %1$s
+ Hapus Kunci PIN
+ Menyimpan...
+ Keamanan
+ Tambahkan PIN jika Anda ingin profil ini dikunci sebelum beralih ke dalamnya.
+ Profil ini dilindungi dengan PIN.
+ Pilih avatar untuk profil ini.
+ Atur Kunci PIN
+ Profil tanpa nama
+ Gunakan Addon Utama
+ Bagikan pengaturan addon profil utama alih-alih mengelola daftar terpisah.
+ Siapa yang menonton?
+ Diunduh
+ Lanjutkan
+ Scraper aktif
+ Memeriksa addon lainnya…
+ Salin tautan stream
+ Unduh file
+ Addon stream yang terpasang gagal mengembalikan respons stream yang valid.
+ Tidak dapat memuat stream
+ Pasang addon terlebih dahulu untuk memuat stream untuk judul ini.
+ Addon yang terpasang tidak menyediakan stream untuk tipe judul ini.
+ Tidak ada addon stream tersedia
+ Tidak ada addon yang terpasang yang mengembalikan stream untuk judul ini.
+ S%1$d E%2$d
+ Episode
+ S%1$dE%2$d - %3$s
+ Mengambil…
+ Mencari sumber…
+ Mencari stream…
+ Tautan stream disalin
+ Tidak ada tautan stream langsung tersedia
+ Tidak ada metadata tersedia
+ Perbarui stream
+ Lanjutkan dari %1$d%
+ Lanjutkan dari %1$s
+ UKURAN %1$s
+ Stream torrent tidak didukung
+ Tutup trailer
+ Tidak dapat memutar trailer
+ Gagal memuat daftar Trakt
+ Gagal memperbarui daftar Trakt
+ %1$s • %2$s
+ Pemeriksaan pembaruan gagal
+ Unduhan gagal
+ Mengunduh %1$d%
+ Tidak dapat memulai instalasi
+ Anda menggunakan versi terbaru.
+ Aktifkan instalasi aplikasi untuk Nuvio, lalu kembali dan lanjutkan.
+ Mengunduh pembaruan...
+ Tidak ada pembaruan ditemukan.
+ Versi baru siap untuk dipasang.
+ Pembaruan dalam aplikasi tidak tersedia di build ini.
+ Mempersiapkan unduhan
+ Catatan rilis
+ Izinkan instalasi untuk melanjutkan
+ Pembaruan tersedia
+ Status pembaruan
+ Addon tersebut sudah terpasang.
+ Masukkan URL addon yang valid
+ Tidak dapat memuat manifes
+ Nuvio
+ Penghapusan akun gagal
+ Masuk gagal
+ Keluar gagal
+ Pendaftaran gagal
+ Tidak dapat memuat item katalog.
+ Berikutnya
+ Berikutnya • S%1$dE%2$d
+ Logo %1$s
+ Gagal memuat komentar
+ Tidak dapat memuat detail dari addon mana pun.
+ Jaringan
+ Tidak ada addon yang menyediakan meta untuk konten ini.
+ Unduhan gagal
+ Menampilkan progres unduhan langsung dan kontrol.
+ Unduhan
+ Unduhan selesai
+ Mengunduh %1$s • %2$s
+ Mengunduh %1$s • %2$s / %3$s
+ Unduhan gagal
+ Dijeda %1$s
+ Hapus
+ Hapus %1$s dari %2$s?
+ Hapus %1$s dari perpustakaan Anda?
+ Hapus dari Perpustakaan?
+ Film
+ Peringatan saat episode baru dari acara yang disimpan dirilis.
+ Pratinjau peringatan rilis episode.
+ Gagal mengirim notifikasi uji coba.
+ Notifikasi uji coba terkirim untuk %1$s.
+ Tidak dapat memutar stream ini.
+ PIN profil ini berubah. Hubungkan sekali untuk menyegarkan kunci di perangkat ini.
+ Tidak dapat menghapus kunci PIN. Coba lagi.
+ Hubungkan ke internet untuk menghapus kunci PIN.
+ PIN ini belum bisa diverifikasi offline di perangkat ini. Hubungkan sekali dan buka kunci secara online terlebih dahulu.
+ Tidak dapat mengatur PIN. Coba lagi.
+ Hubungkan ke internet untuk mengatur PIN.
+ Profil ini menggunakan addon utama.
+ Gagal memuat %1$s
+ Stream
+ Tertanam
+ Otorisasi ditolak
+ Selesaikan masuk Trakt di browser Anda
+ Callback Trakt tidak valid
+ Status callback Trakt tidak valid
+ Respons token Trakt tidak valid
+ Gagal memuat perpustakaan Trakt
+ Daftar %1$d
+ Trakt tidak mengembalikan kode otorisasi
+ Kredensial Trakt hilang
+ Gagal memuat progres Trakt
+ Gagal menyelesaikan masuk Trakt
+ Pengguna Trakt
+ Daftar Tonton
+ Trailer
+ Tidak Diketahui
+ Addon
+ Disimpan
+ Putar %1$s
+ Lanjutkan %1$s
+ JSON kosong.
+ Koleksi %1$d memiliki id kosong.
+ Koleksi \'%1$s\' memiliki judul kosong.
+ Folder %1$d di \'%2$s\' memiliki id kosong.
+ Folder \'%1$s\' di \'%2$s\' memiliki judul kosong.
+ Sumber %1$d di folder \'%2$s\' memiliki kolom kosong.
+ Sumber %1$d di folder \'%2$s\' tidak memiliki ID daftar Trakt.
+ JSON tidak valid: %1$s
+ Addon tidak ditemukan: %1$s
+ Januari
+ Februari
+ Maret
+ April
+ Mei
+ Juni
+ Juli
+ Agustus
+ September
+ Oktober
+ November
+ Desember
+ Jan
+ Feb
+ Mar
+ Apr
+ Mei
+ Jun
+ Jul
+ Agu
+ Sep
+ Okt
+ Nov
+ Des
+ Perusahaan Produksi
+ Jaringan
+ Tidak dapat memuat %1$s
+ Populer
+ Terbaru
+ %1$s • %2$s
+ Nilai Tertinggi
+ Sertifikasi
+ Detail Film
+ Bahasa Asli
+ Negara Asal
+ Info Rilis
+ Durasi
+ Poster
+ Teks
+ Detail Acara
+ Status
+ Video
+ FILE
+ Tidak ada tautan stream langsung tersedia
+ Menggantikan unduhan sebelumnya
+ Unduhan dimulai
+ Format stream tidak didukung untuk unduhan
+ Badan respons kosong
+ Permintaan gagal dengan HTTP %1$d
+ Sistem unduhan belum diinisialisasi
+ Permintaan unduhan gagal
+ %1$s - %2$s
+ Judul yang disimpan akan muncul di sini setelah Anda mengetuk Simpan di layar detail.
+ Perpustakaan Anda kosong
+ Tidak dapat memuat perpustakaan
+ Lainnya
+ Perpustakaan
+ Hubungkan Trakt dan simpan judul ke daftar tonton atau daftar pribadi Anda.
+ Perpustakaan Trakt Anda kosong
+ Tidak dapat memuat perpustakaan Trakt
+ Perpustakaan Trakt
+ Anime
+ Saluran
+ Film
+ Serial
+ TV
+ %1$s sudah tersedia
+ %1$s • %2$s sudah tersedia
+ Episode baru sudah tersedia
+ %1$s sudah tersedia
+ Rilis Episode
+ Kreator
+ Sutradara
+ Penulis
+ Skor Penonton
+ Tidak ada stream trailer yang dapat diputar ditemukan.
+ Musim %1$d - %2$s
+ B
+ KB
+ MB
+ GB
+
diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt
index 160d30b4..2069679d 100644
--- a/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt
+++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt
@@ -531,6 +531,7 @@ private fun MainAppContent(
val hapticFeedback = LocalHapticFeedback.current
val coroutineScope = rememberCoroutineScope()
var selectedTab by rememberSaveable { mutableStateOf(AppScreenTab.Home) }
+ var searchFocusRequestCount by remember { mutableStateOf(0) }
val currentBackStackEntry by navController.currentBackStackEntryAsState()
val nativeRequestedTab by remember { NativeTabBridge.requestedTab }.collectAsStateWithLifecycle()
val liquidGlassNativeTabBarEnabled by remember {
@@ -597,6 +598,9 @@ private fun MainAppContent(
LaunchedEffect(selectedTab) {
NativeTabBridge.publishSelectedTab(selectedTab.toNativeNavigationTab())
+ if (selectedTab != AppScreenTab.Search) {
+ searchFocusRequestCount = 0
+ }
}
DisposableEffect(
@@ -1049,7 +1053,13 @@ private fun MainAppContent(
)
NavItem(
selected = selectedTab == AppScreenTab.Search,
- onClick = { selectedTab = AppScreenTab.Search },
+ onClick = {
+ if (selectedTab == AppScreenTab.Search) {
+ searchFocusRequestCount++
+ } else {
+ selectedTab = AppScreenTab.Search
+ }
+ },
icon = Res.drawable.sidebar_search,
contentDescription = stringResource(Res.string.compose_nav_search),
)
@@ -1083,6 +1093,7 @@ private fun MainAppContent(
.fillMaxSize()
.padding(innerPadding),
selectedTab = selectedTab,
+ searchFocusRequestCount = searchFocusRequestCount,
animateHomeCollectionGifs = tabsRouteActive,
onCatalogClick = onCatalogClick,
onPosterClick = { meta ->
@@ -1137,7 +1148,13 @@ private fun MainAppContent(
if (isTabletLayout && !useNativeBottomTabs) {
TabletFloatingTopBar(
selectedTab = selectedTab,
- onTabSelected = { selectedTab = it },
+ onTabSelected = { tab ->
+ if (tab == AppScreenTab.Search && selectedTab == AppScreenTab.Search) {
+ searchFocusRequestCount++
+ } else {
+ selectedTab = tab
+ }
+ },
onProfileSelected = onProfileSelected,
onAddProfileRequested = onSwitchProfile,
)
@@ -2085,6 +2102,7 @@ private fun rememberGuardedPopBackStack(
private fun AppTabHost(
selectedTab: AppScreenTab,
modifier: Modifier = Modifier,
+ searchFocusRequestCount: Int = 0,
animateHomeCollectionGifs: Boolean = true,
onCatalogClick: ((HomeCatalogSection) -> Unit)? = null,
onPosterClick: ((MetaPreview) -> Unit)? = null,
@@ -2132,6 +2150,7 @@ private fun AppTabHost(
modifier = Modifier.fillMaxSize(),
onPosterClick = onPosterClick,
onPosterLongClick = onPosterLongClick,
+ searchFocusRequestCount = searchFocusRequestCount,
)
}
diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt
index 26a3c82f..3d5cc814 100644
--- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt
+++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt
@@ -33,6 +33,8 @@ import androidx.compose.runtime.snapshotFlow
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.Alignment
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.text.font.FontWeight
@@ -80,7 +82,16 @@ fun SearchScreen(
modifier: Modifier = Modifier,
onPosterClick: ((MetaPreview) -> Unit)? = null,
onPosterLongClick: ((MetaPreview) -> Unit)? = null,
+ searchFocusRequestCount: Int = 0,
) {
+ val focusRequester = remember { FocusRequester() }
+
+ LaunchedEffect(searchFocusRequestCount) {
+ if (searchFocusRequestCount > 0) {
+ focusRequester.requestFocus()
+ }
+ }
+
LaunchedEffect(Unit) {
AddonRepository.initialize()
WatchedRepository.ensureLoaded()
@@ -240,6 +251,7 @@ fun SearchScreen(
value = query,
onValueChange = { query = it },
placeholder = stringResource(Res.string.compose_search_placeholder),
+ modifier = Modifier.focusRequester(focusRequester),
trailingContent = if (query.isNotBlank()) {
{
IconButton(onClick = { query = "" }) {
diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt
index e629434d..679054c2 100644
--- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt
+++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt
@@ -1,32 +1,34 @@
package com.nuvio.app.features.settings
import nuvio.composeapp.generated.resources.Res
+import nuvio.composeapp.generated.resources.lang_czech
import nuvio.composeapp.generated.resources.lang_english
import nuvio.composeapp.generated.resources.lang_french
import nuvio.composeapp.generated.resources.lang_german
-import nuvio.composeapp.generated.resources.lang_spanish
-import nuvio.composeapp.generated.resources.lang_portuguese_portugal
-import nuvio.composeapp.generated.resources.lang_turkish
-import nuvio.composeapp.generated.resources.lang_italian
import nuvio.composeapp.generated.resources.lang_greek
+import nuvio.composeapp.generated.resources.lang_indonesian
+import nuvio.composeapp.generated.resources.lang_italian
import nuvio.composeapp.generated.resources.lang_polish
-import nuvio.composeapp.generated.resources.lang_czech
+import nuvio.composeapp.generated.resources.lang_portuguese_portugal
+import nuvio.composeapp.generated.resources.lang_spanish
+import nuvio.composeapp.generated.resources.lang_turkish
import org.jetbrains.compose.resources.StringResource
enum class AppLanguage(
val code: String,
val labelRes: StringResource,
) {
+ CZECH("cs", Res.string.lang_czech),
ENGLISH("en", Res.string.lang_english),
FRENCH("fr", Res.string.lang_french),
GERMAN("de", Res.string.lang_german),
- SPANISH("es", Res.string.lang_spanish),
- PORTUGUESE("pt", Res.string.lang_portuguese_portugal),
- TURKISH("tr", Res.string.lang_turkish),
- ITALIAN("it", Res.string.lang_italian),
GREEK("el", Res.string.lang_greek),
+ INDONESIAN("id", Res.string.lang_indonesian),
+ ITALIAN("it", Res.string.lang_italian),
POLISH("pl", Res.string.lang_polish),
- CZECH("cs", Res.string.lang_czech),
+ PORTUGUESE("pt", Res.string.lang_portuguese_portugal),
+ SPANISH("es", Res.string.lang_spanish),
+ TURKISH("tr", Res.string.lang_turkish),
;
companion object {