From a85977754c7366463588eed40813fc2093cc0791 Mon Sep 17 00:00:00 2001 From: alphastark Date: Wed, 5 Nov 2025 11:52:01 +0100 Subject: [PATCH 01/82] fix: Swap left and right double tap key event handlers (#2219) (cherry picked from commit d5dda0d2779aa8bbc1010804a6bc8153b92cb88d) --- .../main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt index c4b1b571a0..0cc7ef5acf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt @@ -853,8 +853,8 @@ class PlayerActivity : BaseActivity() { viewModel.changeVolumeBy(-1) viewModel.displayVolumeSlider() } - KeyEvent.KEYCODE_DPAD_RIGHT -> viewModel.handleLeftDoubleTap() - KeyEvent.KEYCODE_DPAD_LEFT -> viewModel.handleRightDoubleTap() + KeyEvent.KEYCODE_DPAD_LEFT -> viewModel.handleLeftDoubleTap() + KeyEvent.KEYCODE_DPAD_RIGHT -> viewModel.handleRightDoubleTap() KeyEvent.KEYCODE_SPACE -> viewModel.pauseUnpause() KeyEvent.KEYCODE_MEDIA_STOP -> finishAndRemoveTask() From 72fd5e0ac3c8843746eff6b449eaa15034f493a4 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Wed, 5 Nov 2025 11:57:36 +0100 Subject: [PATCH 02/82] chore(i18n): Translations update from Hosted Weblate (#2217) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jan Šmedek Co-authored-by: VtrU8i Co-authored-by: kenkoro Co-authored-by: Frosted Co-authored-by: Mousica Co-authored-by: Максим Горпиніч Co-authored-by: Chopper <156493704+choppeh@users.noreply.github.com> Co-authored-by: Joël Miramon (cherry picked from commit 2f5cf775c4d93832aa5acee6b4bca776a869e7ef) --- .../commonMain/moko-resources/as/strings.xml | 2 +- .../moko-resources/base/strings.xml | 38 +-------- .../commonMain/moko-resources/bn/strings.xml | 2 +- .../commonMain/moko-resources/ca/strings.xml | 2 +- .../commonMain/moko-resources/cs/strings.xml | 49 +++++++++++ .../commonMain/moko-resources/de/strings.xml | 2 +- .../commonMain/moko-resources/fa/strings.xml | 2 +- .../commonMain/moko-resources/he/strings.xml | 2 +- .../commonMain/moko-resources/ja/strings.xml | 2 +- .../commonMain/moko-resources/ko/strings.xml | 2 +- .../commonMain/moko-resources/lt/strings.xml | 2 +- .../commonMain/moko-resources/nl/strings.xml | 2 +- .../commonMain/moko-resources/nn/strings.xml | 2 +- .../moko-resources/pt-rBR/strings.xml | 82 ++++++++++++++++++- .../commonMain/moko-resources/sk/strings.xml | 2 +- .../commonMain/moko-resources/sv/strings.xml | 2 +- .../commonMain/moko-resources/ta/strings.xml | 2 +- .../commonMain/moko-resources/tr/strings.xml | 3 +- .../commonMain/moko-resources/uk/strings.xml | 3 +- .../commonMain/moko-resources/vi/strings.xml | 2 +- .../moko-resources/zh-rCN/strings.xml | 2 +- .../moko-resources/zh-rTW/strings.xml | 2 +- 22 files changed, 149 insertions(+), 60 deletions(-) diff --git a/i18n-aniyomi/src/commonMain/moko-resources/as/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/as/strings.xml index 9010a84fa3..e57bf5f4f9 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/as/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/as/strings.xml @@ -146,7 +146,7 @@ স্বয়ংক্ৰিয় চলন সক্ৰিয় স্বয়ংক্ৰিয় চলন অক্ষম এৰি নিদিব - %d ছেকেণ্ডত %s এৰি দিয়া হ’ব + %s ৰ %d ছেকেণ্ডত এৰি দিয়া হ’ব %s এৰি দিয়া হৈছে পৰৱৰ্তী পৰ্ব পোৱা নগ’ল! আগৰ পৰ্ব পোৱা নগ’ল! diff --git a/i18n-aniyomi/src/commonMain/moko-resources/base/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/base/strings.xml index 90317c2d8e..0ebd09d88b 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/base/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/base/strings.xml @@ -1,7 +1,7 @@ - Press back again to exit + Enable Horizontal Seek Started Airing time Unseen episodes @@ -9,7 +9,6 @@ Now Stop Continue - Manga Categories, global update, chapter/episode swipe @@ -38,13 +37,11 @@ Couldn\'t download due to low storage space Warning: large bulk downloads may lead to sources becoming slower and/or blocking Aniyomi. Tap to learn more. Force app to recheck downloaded chapters and episodes - Player settings Player Search player settings Internal player, gestures, decoders, subtitles - Internal player Progress, controls, orientation @@ -102,7 +99,6 @@ External player Always use external player External player preference - Gestures Seeking, double tap, media controls @@ -139,7 +135,6 @@ Play/Pause Next When a media control is set to "Custom", it can be bound through input.conf. The key codes are 0x10004 for previous, 0x10005 for play/pause, and 0x10006 for next. - Decoder Hardware decoding, pixel format, debanding @@ -153,7 +148,6 @@ YUV420P Use YUV420P pixel format May fix black screens on some video codecs, can also improve performance at the cost of quality - Subtitles Preferred languages, whitelist, blacklist @@ -164,7 +158,6 @@ Whitelist for subtitles. If a whitelist is defined, the first subtitle that contains a whitelisted word will be used. Multiple values can be delimited by a comma. Blacklist Blacklist for subtitles. If a blacklist is defined, all subtitles that contains a blacklisted word will be filtered out. Multiple values can be delimited by a comma. - Audio Preferred languages, pitch correction, audio channels @@ -179,7 +172,6 @@ Stereo Reverse stereo Volume boost cap - Custom buttons Execute lua code with custom buttons @@ -197,7 +189,6 @@ Do you wish to delete the button "%s"? On startup (ID: %d) - Script editor Edit and create new scripts and script options @@ -219,7 +210,6 @@ Unable to delete file Delete file Do you wish to delete the file \"%s\"? - Advanced User files, mpv.conf, input.conf @@ -228,7 +218,6 @@ Edit MPV configuration file for further player settings Reset MPV configuration file Edit MPV input file for keyboard mapping configuration - @@ -238,15 +227,12 @@ Ending Recap Mixed opening - %.2fx - Fit to screen Cropped to screen Stretched to screen - %1$s - E%2$s - %3$s Sleep timer ended @@ -258,7 +244,6 @@ Don\'t skip Skipping %s in %d seconds %s skipped - Next Episode not found! Previous Episode not found! @@ -266,7 +251,6 @@ Hoster list is empty No episode loaded Hoster selected from empty list - Set as default #%d: %s (%s) @@ -274,12 +258,10 @@ #%d: %s Delay Palette - Audio delay Sound heard Sound spotted - Subtitle delay Speed @@ -291,7 +273,6 @@ Text seen Sound heard Sound spotted - Colors Text @@ -301,10 +282,8 @@ Green Blue Alpha - Subtitles settings - Typography Font @@ -312,18 +291,15 @@ Border style Border size Shadow offset - Miscellaneous Override ASS/SSA subtitles Scale Position - Outline and shadow Opaque box Background box - Filters Brightness @@ -332,18 +308,14 @@ Saturation Hue Some filters may not work on your current video driver - Add external audio tracks - Tap to load videos Failed to load videos Qualities - %s (%s) - More Hardware decoding mode @@ -359,23 +331,18 @@ Enter duration Pick duration Cancel current timer - Speed Make default speed Enable audio pitch correction Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds - Add external subtitles Secondary subtitles will have no ASS/SSA Styling. - Include Subtitles - Chapters - App language, notifications Cloudflare @@ -383,7 +350,6 @@ Doom Matrix List size - Preserve reading position on read chapters Maximum downloads @@ -395,12 +361,10 @@ Update trackers to episode %d? Trackers updated to chapter %d Trackers updated to episode %d - Unable to migrate episode to season, select season to continue Unable to migrate season to episode Show seasons - Download completed Hide diff --git a/i18n-aniyomi/src/commonMain/moko-resources/bn/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/bn/strings.xml index 4018096685..8ac5616834 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/bn/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/bn/strings.xml @@ -53,4 +53,4 @@ থেমে আছে ডাউনলোড বিরতি অধ্যায়ের হালনাগাদগুলো - \ No newline at end of file + diff --git a/i18n-aniyomi/src/commonMain/moko-resources/ca/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/ca/strings.xml index f93b661289..64c65ceef9 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/ca/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/ca/strings.xml @@ -58,7 +58,7 @@ Reproducció automàtica activada Reproducció automàtica desactivada No saltar - Salta en %d segons + Salta %s en %d segons %s saltats No s\'ha trobat el següent episodi! Establir per defecte el mode decodificació per hardware diff --git a/i18n-aniyomi/src/commonMain/moko-resources/cs/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/cs/strings.xml index 0de45491a0..5b46165f19 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/cs/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/cs/strings.xml @@ -394,4 +394,53 @@ Styl okraje Velikost okraje Posun stínu + Smíšený úvod + Různé + Přepsat ASS/SSA titulky + Měřítko + Pozice + Obrys a stín + Neprůhledný rámeček + Pozadí rámečku + Filtry + Jas + Kontrast + Gamma + Saturace + Odstín + Některé filtry nemusí fungovat s vaším aktuálním ovladačem videa + Přidat externí zvukové stopy + Stisknutím načtete videa + Nepodařilo se načíst videa + Kvality + %s (%s) + Více + Audio kanály + Stránka výchozích statistik + Vypnuto + Strana %d + Vlastní tlačítka + %d sekund + Časovač vypnutí + %s zbývá + Zadat délku trvání + Vybrat délku + Zrušit aktuální časovač + Rychlost + Nastavit výchozí rychlost + Povolit korekci výšky tónu + Zabraňuje tomu, aby se zvuk při vyšších rychlostech stal vysokým a při nižších rychlostech nízkým + Přidat externí titulky + Sekundární titulky nebudou mít styl ASS/SSA. + Kapitoly + Velikost seznamu + Zachovat pozici čtení v přečtených kapitolách + Maximální počet stahování + Vlastní tlačítka + Typ + Nové epizody budou podle předpokladu vydány přibližně za %1$s, kontrolovat to každých %2$s. + Toto anime je buď dokončeno, nebo není známo datum vydání. + Aktualizovat sledovače na epizodu %d? + Sledovače aktualizovány na kapitolu %d + Sledovače aktualizovány na epizodu %d diff --git a/i18n-aniyomi/src/commonMain/moko-resources/de/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/de/strings.xml index 204cb1c491..b29768e5de 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/de/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/de/strings.xml @@ -110,7 +110,7 @@ Automatische Wiedergabe ist an Automatische Wiedergabe ist aus Nicht überspringen - Wird in %d Sekunden übersprungen + %s wird in %d Sekunden übersprungen %s übersprungen Nächste Folge nicht gefunden! Standard Hardware-Dekodierung wählen diff --git a/i18n-aniyomi/src/commonMain/moko-resources/fa/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/fa/strings.xml index 7907f6602d..66ca23a8f9 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/fa/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/fa/strings.xml @@ -46,7 +46,7 @@ پخش خودکار فعال است پخش خودکار فعال نیست گذر نکن - گذر در %d ثانیه + گذر از %s در %d ثانیه %s گذشت شد قسمت‌ بعدی پیدا نشد! تنظیم حالت پیشفرض رمزگشایی سخت افزاری diff --git a/i18n-aniyomi/src/commonMain/moko-resources/he/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/he/strings.xml index 0f663b7c9f..d8a5d03052 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/he/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/he/strings.xml @@ -49,7 +49,7 @@ נגינה אוטומטית מופעלת נגינה אוטומטית כבויה אל תדלג - דלג בעוד %d שניות + דלג %s בעוד %d שניות %s דולג הפרק הבא לא נמצא! הגדר מצב פענוח חומרה ברירת מחדל diff --git a/i18n-aniyomi/src/commonMain/moko-resources/ja/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/ja/strings.xml index 09a062e551..e0cf745e8a 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/ja/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/ja/strings.xml @@ -69,4 +69,4 @@ アニメの拡張機能 漫画を移行 アニメを移行 - \ No newline at end of file + diff --git a/i18n-aniyomi/src/commonMain/moko-resources/ko/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/ko/strings.xml index 1f68da05b1..f77312c67e 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/ko/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/ko/strings.xml @@ -64,7 +64,7 @@ 자동 재생 사용 중 자동 재생이 사용 중지됨 건너뛰지 않기 - %d초 후에 건너뛰기 + %s을 %d초 후에 건너뛰기 %s 건너뜀 다음 에피소드를 찾을 수 없습니다! 기본 하드웨어 디코딩 모드 설정 diff --git a/i18n-aniyomi/src/commonMain/moko-resources/lt/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/lt/strings.xml index f1bb35cc2a..37ce7233f9 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/lt/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/lt/strings.xml @@ -17,4 +17,4 @@ Pridėti į biblioteką? Klaida Pristabdyta - \ No newline at end of file + diff --git a/i18n-aniyomi/src/commonMain/moko-resources/nl/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/nl/strings.xml index bbc524e10f..e2acd8fb53 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/nl/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/nl/strings.xml @@ -57,4 +57,4 @@ Maak standaard Aniyomi-map Beperk downloadsnelheid Zet op 0 voor onbeperkte downloadsnelheid. - \ No newline at end of file + diff --git a/i18n-aniyomi/src/commonMain/moko-resources/nn/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/nn/strings.xml index 666b70cfe2..248cbb4191 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/nn/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/nn/strings.xml @@ -12,4 +12,4 @@ Utelatne kategoriar Legg manga til i bibliotek? Feil - \ No newline at end of file + diff --git a/i18n-aniyomi/src/commonMain/moko-resources/pt-rBR/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/pt-rBR/strings.xml index ee492e464b..9103d98dc0 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/pt-rBR/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/pt-rBR/strings.xml @@ -1,6 +1,6 @@ - Pressione Voltar novamente para sair + Ativar busca horizontal Começou No ar Reordenar @@ -131,7 +131,7 @@ No inicio (ID: %d) Avançado - Scripts, mpv.conf, input.conf + Arquivos do usuário, mpv.conf, input.conf Editar o arquivo de configuração do MPV para obter mais configurações do reprodutor Redefinir arquivo de configuração do MPV Edite o arquivo de entrada MPV para configuração de mapeamento de teclado @@ -354,8 +354,8 @@ Isso removerá a data de exibição deste episódio. Você tem certeza? Redefinir todos os episódios deste anime %1$s: %2$s, %3$s - Progresso: %1$s/%2$s - Progresso: %1$s + %1$s/%2$s + %1$s Ep. %1$s - %2$s Nenhum vídeo encontrado Novos episódios encontrados @@ -451,4 +451,78 @@ Criar arquivo Editar nome do arquivo Nome do arquivo + Episódios não vistos + Comportamento do capítulo + Aviso: downloads em grande volume podem tornar as fontes mais lentas e/ou bloquear o Aniyomi. Toque para saber mais. + Forçar o aplicativo a verificar novamente os capítulos e episódios baixados + Reprodutor interno, gestos, decodificadores, legendas + Exibir hosts com falha + Exibir hosters vazios + Ativar pular introdução + Desative o AniSkip se o vídeo já contiver capítulos + Deslize para a esquerda ou para a direita para retroceder ou avançar + Código inválido: \"%s\" + Editor de script + Edite e crie novos scripts e opções de script + Scripts + Opções de script + O diretório não contém itens. Toque no botão de adição para adicionar um novo arquivo. + Não é possível salvar o arquivo + Não foi possível criar o arquivo + Não é possível renomear o arquivo + Não é possível excluir o arquivo + Excluir arquivo + Deseja excluir o arquivo \"%s\"? + Use arquivos MPV do usuário + Use os arquivos no diretório mpv-config + Pular %1$s + %1$s pulado + Abrindo + Editando + Resumo + Não há vídeos disponíveis + A lista de hoster está vazia + Nenhum episódio carregado + Hoster selecionado a partir de uma lista vazia + Atraso + Paleta + Toque para carregar vídeos + Falha ao carregar vídeos + Qualidades + Capítulos + Tipo + Não foi possível migrar o episódio para a temporada. Selecione a temporada para continuar + Não foi possível migrar a temporada para o episódio + Mostrar temporadas + Botão continuar assistindo + Modo de exibição em grade + Temporada %1$s + Número da temporada + Por número da temporada + Nenhuma temporada encontrada + Configurações padrão da temporada atualizadas + Configurações da temporada + Comportamento do episódio + Marcar episódio duplicado como visto + Depois de assistir a um episódio + Após buscar o novo episódio + Temporada + Atualize as temporadas com episódios na atualização + Atualize temporadas com episódios na atualização da biblioteca + Preenchimento + Marcado com preenchimento + Editar plano de fundo + Plano de fundo personalizado + Plano de fundo salvo + Erro ao salvar o plano de fundo + Erro ao compartilhar o plano de fundo + Definir como plano de fundo + Definir como miniatura + Plano de fundo atualizado + Miniatura atualizada + Falha ao atualizar o plano de fundo + Permitir o download de episódios com marcações de preenchimento + Miniaturas dos episódios + Resumos dos episódios + Hosters diff --git a/i18n-aniyomi/src/commonMain/moko-resources/sk/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/sk/strings.xml index 9d735af0c1..8969166708 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/sk/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/sk/strings.xml @@ -12,4 +12,4 @@ Vymazať databázu Odstránenie histórie mangy, ktorá nie je uložená vo vašej knižnici Pridať mangu do knižnice? - \ No newline at end of file + diff --git a/i18n-aniyomi/src/commonMain/moko-resources/sv/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/sv/strings.xml index 79cd26ea8e..bec29efbb1 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/sv/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/sv/strings.xml @@ -19,4 +19,4 @@ Pausad Nedladdning pausad Kapiteluppdateringar - \ No newline at end of file + diff --git a/i18n-aniyomi/src/commonMain/moko-resources/ta/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/ta/strings.xml index d396edc76b..b08de7cb29 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/ta/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/ta/strings.xml @@ -111,7 +111,7 @@ ஆட்டோ-பிளே இயக்கத்தில் உள்ளது ஆட்டோ-பிளே முடக்கப்பட்டுள்ளது தவிர்க்க வேண்டாம் - %d வினாடிகளில் தவிர்க்கவும் + %s ஐ %d வினாடிகளில் தவிர்க்கவும் %s தவிர்க்கப்பட்டன அடுத்த அத்தியாயம் கிடைக்கவில்லை! வன்பொருள் டிகோடிங் பயன்முறை diff --git a/i18n-aniyomi/src/commonMain/moko-resources/tr/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/tr/strings.xml index e213f4a9b5..4650980ecd 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/tr/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/tr/strings.xml @@ -1,6 +1,6 @@ - Çıkmak için tekrar geriye basın + Yatay Kaydırmayı Etkinleştir Başlandı Yayınlama tarihi Yeniden sırala @@ -527,4 +527,5 @@ Hikâye dışı olarak işaretlenmiş bölümlerin indirilmesine izin ver Bölüm küçük resimleri Bölüm özetleri + Geri almak veya ilerletmek için sola veya sağa kaydır diff --git a/i18n-aniyomi/src/commonMain/moko-resources/uk/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/uk/strings.xml index 05ba73093b..b3c49b3fde 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/uk/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/uk/strings.xml @@ -1,6 +1,6 @@ - Натисніть \"назад\" ще раз, аби вийти + Увімкнути горизонтальний пошук Розпочато Час виходу Змінити порядок @@ -527,4 +527,5 @@ Дозволити завантаження епізодів із позначкою «філлер» Мініатюри епізодів Короткий зміст епізодів + Проведіть пальцем ліворуч або праворуч, щоб перемотати назад або вперед diff --git a/i18n-aniyomi/src/commonMain/moko-resources/vi/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/vi/strings.xml index 63935788d7..42900dd0d8 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/vi/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/vi/strings.xml @@ -67,7 +67,7 @@ Tự động phát đang bật Tự động phát đang tắt Không skip - Skip sau %d giây + Skip %s sau %d giây bỏ qua %s giây Không tìm thấy tập tiếp theo! Chế độ giải mã phần cứng diff --git a/i18n-aniyomi/src/commonMain/moko-resources/zh-rCN/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/zh-rCN/strings.xml index e5aaac86bf..fa9a9c13c8 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/zh-rCN/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/zh-rCN/strings.xml @@ -146,7 +146,7 @@ 自动连播已开启 自动连播已关闭 不跳过 - 将在 %d 秒内跳过 %s + %s 将在 %d 秒内跳过 已跳过 %s 没有下一集! 未找到上一集! diff --git a/i18n-aniyomi/src/commonMain/moko-resources/zh-rTW/strings.xml b/i18n-aniyomi/src/commonMain/moko-resources/zh-rTW/strings.xml index 219a9fbb4f..37781b1077 100644 --- a/i18n-aniyomi/src/commonMain/moko-resources/zh-rTW/strings.xml +++ b/i18n-aniyomi/src/commonMain/moko-resources/zh-rTW/strings.xml @@ -67,7 +67,7 @@ 自動播放已開啟 自動播放已關閉 不要跳過 - %d 秒後跳過 + 跳過 %s 在 %d 秒後 %s 已跳過 未找到下一集! 硬體解碼模式 From d1d6cb889577066bb2ea6892f8bd4eb384daaeb8 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 16:45:02 +0000 Subject: [PATCH 03/82] Update aboutlib.version to v13 (major) (#2580) Update aboutlib.version to v13 (cherry picked from commit 6f6c0338110e0fdd16cfc997981a21b6ed4859bc) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4792a6dc0f..17ea5046b0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -aboutlib_version = "12.2.4" +aboutlib_version = "13.1.0" leakcanary = "2.14" moko = "0.25.1" okhttp_version = "5.2.1" From a8bb7803103906ff09aa9b3bbbb931af5fdf771a Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 16:45:16 +0000 Subject: [PATCH 04/82] Update dependency io.kotest:kotest-assertions-core to v6.0.4 (#2594) (cherry picked from commit 8f972115a82cda8619577e22465a047c2a863a1a) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 17ea5046b0..9f4e6daca4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -91,7 +91,7 @@ sqldelight-dialects-sql = { module = "app.cash.sqldelight:sqlite-3-38-dialect", junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher" } -kotest-assertions = "io.kotest:kotest-assertions-core:6.0.3" +kotest-assertions = "io.kotest:kotest-assertions-core:6.0.4" mockk = "io.mockk:mockk:1.14.6" voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" } From f82953d16532f2779fe4938e591c023f066b6644 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 16:59:21 +0000 Subject: [PATCH 05/82] Update kotlin monorepo to v2.2.21 (#2624) (cherry picked from commit 582ccca1ab327864e72fff0fe05da6757584c280) --- gradle/kotlinx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/kotlinx.versions.toml b/gradle/kotlinx.versions.toml index 905c13b3fa..6c55b83a1a 100644 --- a/gradle/kotlinx.versions.toml +++ b/gradle/kotlinx.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin_version = "2.2.20" +kotlin_version = "2.2.21" serialization_version = "1.9.0" xml_serialization_version = "0.91.2" From 56f10a39e56fa27c361535c840ba8771cb1f044a Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 17:01:34 +0000 Subject: [PATCH 06/82] Update xml.serialization.version to v0.91.3 (#2625) (cherry picked from commit eefaf028ce7bca41d25f77c73e44a1f36af8703a) --- gradle/kotlinx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/kotlinx.versions.toml b/gradle/kotlinx.versions.toml index 6c55b83a1a..91e640b175 100644 --- a/gradle/kotlinx.versions.toml +++ b/gradle/kotlinx.versions.toml @@ -1,7 +1,7 @@ [versions] kotlin_version = "2.2.21" serialization_version = "1.9.0" -xml_serialization_version = "0.91.2" +xml_serialization_version = "0.91.3" [libraries] reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin_version" } From 4f6a5560c2b157d3a4cc2e1349f3627e784a26cf Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 17:06:40 +0000 Subject: [PATCH 07/82] Update dependency com.google.firebase:firebase-bom to v34.5.0 (#2575) (cherry picked from commit 5ac58d01b82daae809139ccb4245802816d23ff8) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9f4e6daca4..5685cd72f4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ sqlite = "2.6.1" voyager = "1.1.0-beta03" spotless = "8.0.0" ktlint-core = "1.7.1" -firebase-bom = "34.3.0" +firebase-bom = "34.5.0" markdown = "0.37.0" junit = "6.0.0" From 72507d5eeb4a83ff4e6b1447bc3be067257a0397 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 17:06:58 +0000 Subject: [PATCH 08/82] Update GitHub Actions (#2581) (cherry picked from commit 3c731c2cf57de3d2372c5ea8b136b5819dfcbda2) --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4915e9bac7..94125a6577 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,7 +38,7 @@ jobs: - name: Dependency Review if: github.event_name == 'pull_request' - uses: actions/dependency-review-action@56339e523c0409420f6c2c9a2f4292bbb3c07dd3 # v4.8.0 + uses: actions/dependency-review-action@40c09b7dc99638e5ddb0bfd91c1673effc064d8a # v4.8.1 - name: Set up JDK uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0ea0beba5c..ee210d7eae 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -110,7 +110,7 @@ jobs: Animiru - name: Create GitHub Release - uses: softprops/action-gh-release@aec2ec56f94eb8180ceec724245f64ef008b89f5 # v2.4.0 + uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1 with: tag_name: ${{ needs.get_tag.outputs.tag }} name: Animiru ${{ needs.get_tag.outputs.tag }} From 55aa6f1a2c4140efa41dec3913a11df4054ba62b Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 17:07:38 +0000 Subject: [PATCH 09/82] Update dependency com.squareup.okio:okio to v3.16.2 (#2576) (cherry picked from commit e9224bc2ba19a5a78dd16c30615f2cae5b02ba5d) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5685cd72f4..ba2c960cc9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,7 +23,7 @@ okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp_ve okhttp-logging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp_version" } okhttp-brotli = { module = "com.squareup.okhttp3:okhttp-brotli", version.ref = "okhttp_version" } okhttp-dnsoverhttps = { module = "com.squareup.okhttp3:okhttp-dnsoverhttps", version.ref = "okhttp_version" } -okio = "com.squareup.okio:okio:3.16.0" +okio = "com.squareup.okio:okio:3.16.2" conscrypt-android = "org.conscrypt:conscrypt-android:2.5.3" From b4856e9d5468c8c2be8ed2b5a5aa2bcc3f79b5a9 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 17:07:58 +0000 Subject: [PATCH 10/82] Update dependency androidx.work:work-runtime to v2.11.0 (#2626) (cherry picked from commit 3ff25bc984717052b57484859283c96583d152b2) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index c7c8e3d867..734f735fdc 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -21,7 +21,7 @@ lifecycle-common = { module = "androidx.lifecycle:lifecycle-common", version.ref lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version.ref = "lifecycle_version" } lifecycle-runtimektx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle_version" } -workmanager = "androidx.work:work-runtime:2.10.5" +workmanager = "androidx.work:work-runtime:2.11.0" paging-runtime = { module = "androidx.paging:paging-runtime", version.ref = "paging_version" } paging-compose = { module = "androidx.paging:paging-compose", version.ref = "paging_version" } From 3844a7b35a46ca5ee8c5b97a4cb72c94d4251aa8 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 18:10:37 +0100 Subject: [PATCH 11/82] Update GitHub Actions (major) (#2627) (cherry picked from commit fa96366b55338cc3ed67e8f2b9731ac2c7589a97) --- .github/workflows/build.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 94125a6577..f44a35e4c0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,13 +59,13 @@ jobs: run: ./gradlew testReleaseUnitTest - name: Upload APK - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: arm64-v8a-${{ github.sha }} path: app/build/outputs/apk/release/app-arm64-v8a-release-unsigned.apk - name: Upload mapping - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: mapping-${{ github.sha }} path: app/build/outputs/mapping/release diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ee210d7eae..6675a3455b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -80,7 +80,7 @@ jobs: mv app/build/outputs/apk/release/app-x86_64-release-unsigned-signed.apk Animiru-x86_64-${{ needs.get_tag.outputs.tag }}.apk - name: Upload APK - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: Animiru path: | @@ -98,7 +98,7 @@ jobs: steps: - name: Download all artifacts - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: merge-multiple: true From 95ea1e00c83ab2c4ce0e10a20ea6e84e4cd397c8 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 17:17:09 +0000 Subject: [PATCH 12/82] Update plugin google-services to v4.4.4 (#2573) (cherry picked from commit 72c4d1fdee981ca0bc94cd32d0a43bb739f43a61) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ba2c960cc9..c104882f14 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -108,7 +108,7 @@ markdown-coil = { module = "com.mikepenz:multiplatform-markdown-renderer-coil3", stringSimilarity = { module = "com.aallam.similarity:string-similarity-kotlin", version = "0.1.0" } [plugins] -google-services = { id = "com.google.gms.google-services", version = "4.4.3" } +google-services = { id = "com.google.gms.google-services", version = "4.4.4" } aboutLibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutlib_version" } sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" } moko = { id = "dev.icerock.mobile.multiplatform-resources", version.ref = "moko" } From af01f8c6e7c7755ee265b06a0912ab8b765b83c4 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 17:19:26 +0000 Subject: [PATCH 13/82] Update okhttp monorepo to v5.3.0 (#2628) (cherry picked from commit 0b6de39f2f878f1188a4fc1ea989517bad38e6ca) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c104882f14..b1b2efdd13 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ aboutlib_version = "13.1.0" leakcanary = "2.14" moko = "0.25.1" -okhttp_version = "5.2.1" +okhttp_version = "5.3.0" shizuku_version = "13.1.0" sqldelight = "2.1.0" sqlite = "2.6.1" From b575843b5c92a7104a5fee7307f8758f3e17fc32 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 19:26:50 +0100 Subject: [PATCH 14/82] Migrate Kitsu to use library_id and remote_id properly Co-authored-by: Constantin Piber <59023762+cpiber@users.noreply.github.com> --- .../java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt | 1 + .../eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt | 10 +++++----- .../tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt | 3 ++- data/src/main/sqldelight/tachiyomi/migrations/136.sqm | 7 +++++++ 4 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 data/src/main/sqldelight/tachiyomi/migrations/136.sqm diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt index 95c06070f0..72fb3848f2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt @@ -105,6 +105,7 @@ class Kitsu(id: Long) : BaseTracker(id, "Kitsu"), DeletableTracker { return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack, copyRemotePrivate = false) track.remote_id = remoteTrack.remote_id + track.library_id = remoteTrack.library_id if (track.status != COMPLETED) { track.status = if (hasSeenEpisodes) WATCHING else track.status diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt index 63e1a3f84c..699333578f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt @@ -76,7 +76,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) .awaitSuccess() .parseAs() .let { - track.remote_id = it.data.id + track.library_id = it.data.id track } } @@ -88,7 +88,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) val data = buildJsonObject { putJsonObject("data") { put("type", "libraryEntries") - put("id", track.remote_id) + put("id", track.library_id) putJsonObject("attributes") { put("status", track.toApiStatus()) put("progress", track.last_episode_seen.toInt()) @@ -102,7 +102,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) authClient.newCall( Request.Builder() - .url("${BASE_URL}library-entries/${track.remote_id}") + .url("${BASE_URL}library-entries/${track.library_id}") .headers( headersOf("Content-Type", VND_API_JSON), ) @@ -119,7 +119,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) withIOContext { authClient.newCall( DELETE( - "${BASE_URL}library-entries/${track.remoteId}", + "${BASE_URL}library-entries/${track.libraryId}", headers = headersOf("Content-Type", VND_API_JSON), ), ) @@ -192,7 +192,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun getLibAnime(track: Track): Track { return withIOContext { val url = "${BASE_URL}library-entries".toUri().buildUpon() - .encodedQuery("filter[id]=${track.remote_id}") + .encodedQuery("filter[id]=${track.library_id}") .appendQueryParameter("include", "anime") .build() with(json) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt index 94a542c440..1933f4bbc1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt @@ -21,7 +21,8 @@ data class KitsuListSearchResult( val anime = included[0].attributes return TrackSearch.create(TrackerManager.KITSU).apply { - remote_id = userData.id + remote_id = included[0].id + library_id = userData.id title = anime.canonicalTitle total_episodes = anime.episodeCount ?: 0 cover_url = anime.posterImage?.original ?: "" diff --git a/data/src/main/sqldelight/tachiyomi/migrations/136.sqm b/data/src/main/sqldelight/tachiyomi/migrations/136.sqm new file mode 100644 index 0000000000..5cd6111d44 --- /dev/null +++ b/data/src/main/sqldelight/tachiyomi/migrations/136.sqm @@ -0,0 +1,7 @@ +-- Save the current remote_id as library_id, since old Kitsu tracker did not use this correctly +UPDATE anime_sync SET library_id = remote_id WHERE sync_id = 3; + +-- Kitsu and Suwayomi aren't using the remote_id field properly, but for both the ID is present in the URL +-- This parses a url and gets the ID from the trailing path part, e.g. https://kitsu.app/anime/ +-- Based on https://stackoverflow.com/a/38330814 +UPDATE anime_sync SET remote_id = replace(remote_url, rtrim(remote_url, replace(remote_url, '/', '')), '') WHERE sync_id IN (3, 9); From c4c0dcfbd501f44557a3ca8304bc39251e076f0c Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+antsylich@users.noreply.github.com> Date: Fri, 31 Oct 2025 19:50:19 +0100 Subject: [PATCH 15/82] Fix mass migration advanced search query building (#2629) (cherry picked from commit 7c08b75555a5444ede4912dc5e32607fac2b9678) --- .../feature/migration/list/search/BaseSmartSearchEngine.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/mihon/feature/migration/list/search/BaseSmartSearchEngine.kt b/app/src/main/java/mihon/feature/migration/list/search/BaseSmartSearchEngine.kt index 38a33a2125..988b104fe0 100644 --- a/app/src/main/java/mihon/feature/migration/list/search/BaseSmartSearchEngine.kt +++ b/app/src/main/java/mihon/feature/migration/list/search/BaseSmartSearchEngine.kt @@ -95,8 +95,8 @@ abstract class BaseSmartSearchEngine( } private fun removeTextInBrackets(text: String, readForward: Boolean): String { - val openingChars = if (readForward) "([<{ " else ")]}>" - val closingChars = if (readForward) ")]}>" else "([<{ " + val openingChars = if (readForward) "([<{" else ")]}>" + val closingChars = if (readForward) ")]}>" else "([<{" var depth = 0 return buildString { From 8e5d48c0dae5a45584afcb6105868839bf3c0018 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 31 Oct 2025 19:06:55 +0000 Subject: [PATCH 16/82] Update dependency org.junit.jupiter:junit-jupiter to v6.0.1 (#2630) (cherry picked from commit 343074da5f7b5b6b2bb8116cc65348684d4bf615) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b1b2efdd13..84148a13ef 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ spotless = "8.0.0" ktlint-core = "1.7.1" firebase-bom = "34.5.0" markdown = "0.37.0" -junit = "6.0.0" +junit = "6.0.1" [libraries] desugar = "com.android.tools:desugar_jdk_libs:2.1.5" From dd16b2a4bbd573c60a8033cf84bed09c5811cc6f Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 19:33:37 +0100 Subject: [PATCH 17/82] Fix migration dialog migrating to wrong entry Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../migration/dialog/MigrateAnimeDialog.kt | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/mihon/feature/migration/dialog/MigrateAnimeDialog.kt b/app/src/main/java/mihon/feature/migration/dialog/MigrateAnimeDialog.kt index 00def0ac99..ae2089b032 100644 --- a/app/src/main/java/mihon/feature/migration/dialog/MigrateAnimeDialog.kt +++ b/app/src/main/java/mihon/feature/migration/dialog/MigrateAnimeDialog.kt @@ -66,13 +66,16 @@ internal fun Screen.MigrateAnimeDialog( ) { val scope = rememberCoroutineScope() - val screenModel = rememberScreenModel { MigrateDialogScreenModel(current, target) } + val screenModel = rememberScreenModel { MigrateDialogScreenModel() } + LaunchedEffect(current, target) { + screenModel.init(current, target) + } val state by screenModel.state.collectAsState() + + if (state.isMigrated) return + // AY --> val canMigrate = remember(current.fetchType, target.fetchType) { current.fetchType == target.fetchType } - LaunchedEffect(current, target) { - screenModel.initialize(current, target) - } // <-- AY if (state.isMigrating) { @@ -185,8 +188,6 @@ internal fun Screen.MigrateAnimeDialog( } private class MigrateDialogScreenModel( - private val _current: Anime, - private val _target: Anime, private val sourcePreference: SourcePreferences = Injekt.get(), private val coverCache: CoverCache = Injekt.get(), // AY --> @@ -196,16 +197,7 @@ private class MigrateDialogScreenModel( private val migrateAnime: MigrateAnimeUseCase = Injekt.get(), ) : StateScreenModel(State()) { - // AY --> - // Hack do get around screenmodel not being disposed - private var current: Anime = _current - private var target: Anime = _target - private var hasInitialized: Boolean = false - fun initialize(currentAnime: Anime, targetAnime: Anime) { - if (hasInitialized && currentAnime == current && targetAnime == target) return - current = currentAnime - target = targetAnime - + fun init(current: Anime, target: Anime) { val applicableFlags = buildList { MigrationFlag.entries.forEach { val applicable = when (it) { @@ -222,13 +214,14 @@ private class MigrateDialogScreenModel( } } val selectedFlags = sourcePreference.migrationFlags().get() - mutableState.update { it.copy(applicableFlags = applicableFlags, selectedFlags = selectedFlags) } - hasInitialized = true - } - // <-- AY - - init { - initialize(_current, _target) + mutableState.update { + it.copy( + current = current, + target = target, + applicableFlags = applicableFlags, + selectedFlags = selectedFlags, + ) + } } fun toggleSelection(flag: MigrationFlag) { @@ -241,15 +234,21 @@ private class MigrateDialogScreenModel( } suspend fun migrateAnime(replace: Boolean) { - sourcePreference.migrationFlags().set(state.value.selectedFlags) + val state = state.value + val current = state.current ?: return + val target = state.target ?: return + sourcePreference.migrationFlags().set(state.selectedFlags) mutableState.update { it.copy(isMigrating = true) } migrateAnime(current, target, replace) - mutableState.update { it.copy(isMigrating = false) } + mutableState.update { it.copy(isMigrating = false, isMigrated = true) } } data class State( + val current: Anime? = null, + val target: Anime? = null, val applicableFlags: List = emptyList(), val selectedFlags: Set = emptySet(), val isMigrating: Boolean = false, + val isMigrated: Boolean = false, ) } From 79519201ec0c0a5e432c7c6718d73b8af5413eba Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 19:35:15 +0100 Subject: [PATCH 18/82] Fix migration "Attempt to invoke virtual method" crash Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../migration/config/MigrationConfigScreen.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/mihon/feature/migration/config/MigrationConfigScreen.kt b/app/src/main/java/mihon/feature/migration/config/MigrationConfigScreen.kt index d19660de24..2cd031df16 100644 --- a/app/src/main/java/mihon/feature/migration/config/MigrationConfigScreen.kt +++ b/app/src/main/java/mihon/feature/migration/config/MigrationConfigScreen.kt @@ -315,13 +315,6 @@ class MigrationConfigScreen(private val animeIds: Collection) : Screen() { private val sourceManager: SourceManager = Injekt.get(), ) : StateScreenModel(State()) { - init { - screenModelScope.launchIO { - initSources() - mutableState.update { it.copy(isLoading = false) } - } - } - private val sourcesComparator = { includedSources: List -> compareBy( { !it.isSelected }, @@ -330,6 +323,13 @@ class MigrationConfigScreen(private val animeIds: Collection) : Screen() { ) } + init { + screenModelScope.launchIO { + initSources() + mutableState.update { it.copy(isLoading = false) } + } + } + private fun updateSources(save: Boolean = true, action: (List) -> List) { mutableState.update { state -> val updatedSources = action(state.sources) From b44716c03540c0ab256d29e47422c6992e6ea0ee Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 19:36:01 +0100 Subject: [PATCH 19/82] Bump app version code and default user agent Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- app/build.gradle.kts | 2 +- .../kotlin/eu/kanade/tachiyomi/network/NetworkPreferences.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bd0e6aced7..172d76af23 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,7 +19,7 @@ android { defaultConfig { applicationId = "xyz.Quickdev.Animiru.mi" - versionCode = 131 + versionCode = 132 versionName = "0.19.0.0" buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"") diff --git a/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/NetworkPreferences.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/NetworkPreferences.kt index b3e95dad87..d2034be860 100644 --- a/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/NetworkPreferences.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/NetworkPreferences.kt @@ -19,7 +19,7 @@ class NetworkPreferences( fun defaultUserAgent(): Preference { return preferenceStore.getString( "default_user_agent", - "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36", ) } } From 09b04a4695067eacecfcf9687b6388b09f227b33 Mon Sep 17 00:00:00 2001 From: NGB-Was-Taken <76197326+NGB-Was-Taken@users.noreply.github.com> Date: Sat, 1 Nov 2025 13:53:10 +0545 Subject: [PATCH 20/82] Update shizuku.version to v13.1.5 (#2566) Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> (cherry picked from commit e9469451acf6c7ad39ff08e344ad5013ddc39337) --- .editorconfig | 2 +- app/build.gradle.kts | 2 +- .../mihon/app/shizuku/IShellInterface.aidl | 7 + .../extension/installer/ShizukuInstaller.kt | 153 ++++++++------- .../java/mihon/app/shizuku/ShellInterface.kt | 176 ++++++++++++++++++ gradle/libs.versions.toml | 2 +- 6 files changed, 275 insertions(+), 67 deletions(-) create mode 100644 app/src/main/aidl/mihon/app/shizuku/IShellInterface.aidl create mode 100644 app/src/main/java/mihon/app/shizuku/ShellInterface.kt diff --git a/.editorconfig b/.editorconfig index a02bac8fde..c7c0ccbc7d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,7 +7,7 @@ indent_style = space insert_final_newline = true trim_trailing_whitespace = true -[*.{xml,sq,sqm}] +[*.{xml,sq,sqm,aidl}] indent_size = 4 # noinspection EditorConfigKeyCorrectness diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 172d76af23..fea141b6e3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -137,9 +137,9 @@ android { buildFeatures { viewBinding = true buildConfig = true + aidl = true // Disable some unused things - aidl = false renderScript = false shaders = false } diff --git a/app/src/main/aidl/mihon/app/shizuku/IShellInterface.aidl b/app/src/main/aidl/mihon/app/shizuku/IShellInterface.aidl new file mode 100644 index 0000000000..3f56b52d28 --- /dev/null +++ b/app/src/main/aidl/mihon/app/shizuku/IShellInterface.aidl @@ -0,0 +1,7 @@ +package mihon.app.shizuku; + +interface IShellInterface { + void install(in AssetFileDescriptor apk) = 1; + + void destroy() = 16777114; +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/ShizukuInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/ShizukuInstaller.kt index 24a8cb377c..303a2dad88 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/ShizukuInstaller.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/ShizukuInstaller.kt @@ -1,27 +1,73 @@ package eu.kanade.tachiyomi.extension.installer import android.app.Service +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.ServiceConnection +import android.content.pm.PackageInstaller import android.content.pm.PackageManager -import android.os.Process +import android.os.IBinder +import androidx.core.content.ContextCompat +import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.extension.model.InstallStep -import eu.kanade.tachiyomi.util.system.getUriSize import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel -import kotlinx.coroutines.launch import logcat.LogPriority +import mihon.app.shizuku.IShellInterface +import mihon.app.shizuku.ShellInterface import rikka.shizuku.Shizuku import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR -import java.io.BufferedReader -import java.io.InputStream class ShizukuInstaller(private val service: Service) : Installer(service) { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + private var shellInterface: IShellInterface? = null + + private val shizukuArgs by lazy { + Shizuku.UserServiceArgs( + ComponentName(service, ShellInterface::class.java), + ) + .tag("shizuku_service") + .processNameSuffix("shizuku_service") + .debuggable(BuildConfig.DEBUG) + .daemon(false) + } + + private val connection = object : ServiceConnection { + override fun onServiceConnected(name: ComponentName?, service: IBinder?) { + shellInterface = IShellInterface.Stub.asInterface(service) + ready = true + checkQueue() + } + + override fun onServiceDisconnected(name: ComponentName?) { + shellInterface = null + } + } + + private val receiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, Int.MIN_VALUE) + val message = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + val packageName = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME) + + if (status == PackageInstaller.STATUS_SUCCESS) { + continueQueue(InstallStep.Installed) + } else { + logcat(LogPriority.ERROR) { "Failed to install extension $packageName: $message" } + continueQueue(InstallStep.Error) + } + } + } + private val shizukuDeadListener = Shizuku.OnBinderDeadListener { logcat { "Shizuku was killed prematurely" } service.stopSelf() @@ -31,8 +77,8 @@ class ShizukuInstaller(private val service: Service) : Installer(service) { override fun onRequestPermissionResult(requestCode: Int, grantResult: Int) { if (requestCode == SHIZUKU_PERMISSION_REQUEST_CODE) { if (grantResult == PackageManager.PERMISSION_GRANTED) { - ready = true checkQueue() + Shizuku.bindUserService(shizukuArgs, connection) } else { service.stopSelf() } @@ -41,40 +87,34 @@ class ShizukuInstaller(private val service: Service) : Installer(service) { } } + fun initShizuku() { + if (ready) return + if (!Shizuku.pingBinder()) { + logcat(LogPriority.ERROR) { "Shizuku is not ready to use" } + service.toast(MR.strings.ext_installer_shizuku_stopped) + service.stopSelf() + return + } + + if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { + Shizuku.bindUserService(shizukuArgs, connection) + } else { + Shizuku.addRequestPermissionResultListener(shizukuPermissionListener) + Shizuku.requestPermission(SHIZUKU_PERMISSION_REQUEST_CODE) + } + } + override var ready = false override fun processEntry(entry: Entry) { super.processEntry(entry) - scope.launch { - var sessionId: String? = null - try { - val size = service.getUriSize(entry.uri) ?: throw IllegalStateException() - service.contentResolver.openInputStream(entry.uri)!!.use { - val userId = Process.myUserHandle().hashCode() - val createCommand = "pm install-create --user $userId -r -i ${service.packageName} -S $size" - val createResult = exec(createCommand) - sessionId = SESSION_ID_REGEX.find(createResult.out)?.value - ?: throw RuntimeException("Failed to create install session") - - val writeResult = exec("pm install-write -S $size $sessionId base -", it) - if (writeResult.resultCode != 0) { - throw RuntimeException("Failed to write APK to session $sessionId") - } - - val commitResult = exec("pm install-commit $sessionId") - if (commitResult.resultCode != 0) { - throw RuntimeException("Failed to commit install session $sessionId") - } - - continueQueue(InstallStep.Installed) - } - } catch (e: Exception) { - logcat(LogPriority.ERROR, e) { "Failed to install extension ${entry.downloadId} ${entry.uri}" } - if (sessionId != null) { - exec("pm install-abandon $sessionId") - } - continueQueue(InstallStep.Error) - } + try { + shellInterface?.install( + service.contentResolver.openAssetFileDescriptor(entry.uri, "r"), + ) + } catch (e: Exception) { + logcat(LogPriority.ERROR, e) { "Failed to install extension ${entry.downloadId} ${entry.uri}" } + continueQueue(InstallStep.Error) } } @@ -84,41 +124,26 @@ class ShizukuInstaller(private val service: Service) : Installer(service) { override fun onDestroy() { Shizuku.removeBinderDeadListener(shizukuDeadListener) Shizuku.removeRequestPermissionResultListener(shizukuPermissionListener) + Shizuku.unbindUserService(shizukuArgs, connection, true) + service.unregisterReceiver(receiver) + logcat { "ShizukuInstaller destroy" } scope.cancel() super.onDestroy() } - private fun exec(command: String, stdin: InputStream? = null): ShellResult { - @Suppress("DEPRECATION") - val process = Shizuku.newProcess(arrayOf("sh", "-c", command), null, null) - if (stdin != null) { - process.outputStream.use { stdin.copyTo(it) } - } - val output = process.inputStream.bufferedReader().use(BufferedReader::readText) - val resultCode = process.waitFor() - return ShellResult(resultCode, output) - } - - private data class ShellResult(val resultCode: Int, val out: String) - init { Shizuku.addBinderDeadListener(shizukuDeadListener) - ready = if (Shizuku.pingBinder()) { - if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { - true - } else { - Shizuku.addRequestPermissionResultListener(shizukuPermissionListener) - Shizuku.requestPermission(SHIZUKU_PERMISSION_REQUEST_CODE) - false - } - } else { - logcat(LogPriority.ERROR) { "Shizuku is not ready to use" } - service.toast(MR.strings.ext_installer_shizuku_stopped) - service.stopSelf() - false - } + + ContextCompat.registerReceiver( + service, + receiver, + IntentFilter(ACTION_INSTALL_RESULT), + ContextCompat.RECEIVER_EXPORTED, + ) + + initShizuku() } } private const val SHIZUKU_PERMISSION_REQUEST_CODE = 14045 -private val SESSION_ID_REGEX = Regex("(?<=\\[).+?(?=])") +const val ACTION_INSTALL_RESULT = "${BuildConfig.APPLICATION_ID}.ACTION_INSTALL_RESULT" diff --git a/app/src/main/java/mihon/app/shizuku/ShellInterface.kt b/app/src/main/java/mihon/app/shizuku/ShellInterface.kt new file mode 100644 index 0000000000..3326ff2705 --- /dev/null +++ b/app/src/main/java/mihon/app/shizuku/ShellInterface.kt @@ -0,0 +1,176 @@ +/* + * Copyright 2024 Mihon Open Source Project + * Copyright 2015-2024 Javier Tomás + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * The file contains code originally licensed under the MIT license: + * + * Copyright (c) 2024 Zachary Wander + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package mihon.app.shizuku + +import android.annotation.SuppressLint +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.content.IntentSender +import android.content.pm.PackageInstaller +import android.content.res.AssetFileDescriptor +import android.os.Build +import android.os.IBinder +import android.os.ParcelFileDescriptor +import android.os.UserHandle +import eu.kanade.tachiyomi.BuildConfig +import eu.kanade.tachiyomi.extension.installer.ACTION_INSTALL_RESULT +import rikka.shizuku.SystemServiceHelper +import java.io.OutputStream +import kotlin.system.exitProcess + +class ShellInterface : IShellInterface.Stub() { + + private val context = createContext() + private val userId = UserHandle::class.java + .getMethod("myUserId") + .invoke(null) as Int + private val packageName = BuildConfig.APPLICATION_ID + + @SuppressLint("PrivateApi") + override fun install(apk: AssetFileDescriptor) { + val pmInterface = Class.forName($$"android.content.pm.IPackageManager$Stub") + .getMethod("asInterface", IBinder::class.java) + .invoke(null, SystemServiceHelper.getSystemService("package")) + + val packageInstaller = Class.forName("android.content.pm.IPackageManager") + .getMethod("getPackageInstaller") + .invoke(pmInterface) + + val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL).apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + setPackageSource(PackageInstaller.PACKAGE_SOURCE_STORE) + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + setInstallerPackageName(packageName) + } + } + + val sessionId = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + packageInstaller::class.java.getMethod( + "createSession", + PackageInstaller.SessionParams::class.java, + String::class.java, + String::class.java, + Int::class.java, + ).invoke(packageInstaller, params, packageName, packageName, userId) as Int + } else { + packageInstaller::class.java.getMethod( + "createSession", + PackageInstaller.SessionParams::class.java, + String::class.java, + Int::class.java, + ).invoke(packageInstaller, params, packageName, userId) as Int + } + + val session = packageInstaller::class.java + .getMethod("openSession", Int::class.java) + .invoke(packageInstaller, sessionId) + + ( + session::class.java.getMethod( + "openWrite", + String::class.java, + Long::class.java, + Long::class.java, + ).invoke(session, "extension", 0L, apk.length) as ParcelFileDescriptor + ).let { fd -> + val revocable = Class.forName("android.os.SystemProperties") + .getMethod("getBoolean", String::class.java, Boolean::class.java) + .invoke(null, "fw.revocable_fd", false) as Boolean + + if (revocable) { + ParcelFileDescriptor.AutoCloseOutputStream(fd) + } else { + Class.forName($$"android.os.FileBridge$FileBridgeOutputStream") + .getConstructor(ParcelFileDescriptor::class.java) + .newInstance(fd) as OutputStream + } + } + .use { output -> + apk.createInputStream().use { input -> input.copyTo(output) } + } + + val statusIntent = PendingIntent.getBroadcast( + context, + 0, + Intent(ACTION_INSTALL_RESULT).setPackage(packageName), + PendingIntent.FLAG_MUTABLE, + ) + + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { + session::class.java.getMethod("commit", IntentSender::class.java, Boolean::class.java) + .invoke(session, statusIntent.intentSender, false) + } else { + session::class.java.getMethod("commit", IntentSender::class.java) + .invoke(session, statusIntent.intentSender) + } + } + + override fun destroy() { + exitProcess(0) + } + + @SuppressLint("PrivateApi") + private fun createContext(): Context { + val activityThread = Class.forName("android.app.ActivityThread") + val systemMain = activityThread.getMethod("systemMain").invoke(null) + val systemContext = activityThread.getMethod("getSystemContext").invoke(systemMain) as Context + + val shellUserHandle = UserHandle::class.java + .getConstructor(Int::class.java) + .newInstance(userId) + + val shellContext = systemContext::class.java.getMethod( + "createPackageContextAsUser", + String::class.java, + Int::class.java, + UserHandle::class.java, + ).invoke( + systemContext, + "com.android.shell", + Context.CONTEXT_INCLUDE_CODE or Context.CONTEXT_IGNORE_SECURITY, + shellUserHandle, + ) as Context + + return shellContext.createPackageContext("com.android.shell", 0) + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 84148a13ef..e4a33830cb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ aboutlib_version = "13.1.0" leakcanary = "2.14" moko = "0.25.1" okhttp_version = "5.3.0" -shizuku_version = "13.1.0" +shizuku_version = "13.1.5" sqldelight = "2.1.0" sqlite = "2.6.1" voyager = "1.1.0-beta03" From 1056089ac427f14329d96ddc447b4cade5f53b6e Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 20:04:45 +0100 Subject: [PATCH 21/82] Add subtitle support to slider preference and general cleanup Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../anime/SeasonSettingsDialog.kt | 4 +- .../library/LibrarySettingsDialog.kt | 4 +- .../presentation/more/settings/Preference.kt | 51 ++++++++++--------- .../more/settings/PreferenceItem.kt | 11 ++-- .../more/settings/PreferenceScreen.kt | 2 +- .../settings/screen/SettingsSearchScreen.kt | 2 +- .../settings/screen/debug/DebugInfoScreen.kt | 2 +- .../player/PlayerSettingsAudioScreen.kt | 7 +-- .../player/PlayerSettingsPlayerScreen.kt | 7 +-- .../core/components/SettingsItems.kt | 47 +++++++++++------ 10 files changed, 74 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/anime/SeasonSettingsDialog.kt b/app/src/main/java/eu/kanade/presentation/anime/SeasonSettingsDialog.kt index c66578415e..fda73f53a4 100644 --- a/app/src/main/java/eu/kanade/presentation/anime/SeasonSettingsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/anime/SeasonSettingsDialog.kt @@ -262,7 +262,7 @@ private fun ColumnScope.SeasonDisplayPage( value = displayGridModeSize, valueRange = 0..10, label = stringResource(AYMR.strings.pref_library_rows), - valueText = if (displayGridModeSize > 0) { + valueString = if (displayGridModeSize > 0) { displayGridModeSize.toString() } else { stringResource(MR.strings.label_auto) @@ -275,7 +275,7 @@ private fun ColumnScope.SeasonDisplayPage( value = displayGridModeSize, valueRange = 0..10, label = stringResource(MR.strings.pref_library_columns), - valueText = if (displayGridModeSize > 0) { + valueString = if (displayGridModeSize > 0) { displayGridModeSize.toString() } else { stringResource(MR.strings.label_auto) diff --git a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt index 6a39a34810..f19eb27859 100644 --- a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt @@ -294,7 +294,7 @@ private fun ColumnScope.DisplayPage( value = columns, valueRange = 0..10, label = stringResource(AYMR.strings.pref_library_rows), - valueText = if (columns > 0) { + valueString = if (columns > 0) { columns.toString() } else { stringResource(MR.strings.label_auto) @@ -308,7 +308,7 @@ private fun ColumnScope.DisplayPage( value = columns, valueRange = 0..10, label = stringResource(MR.strings.pref_library_columns), - valueText = if (columns > 0) { + valueString = if (columns > 0) { columns.toString() } else { stringResource(MR.strings.label_auto) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt b/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt index ae0720c274..126542d2de 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt @@ -26,10 +26,10 @@ sealed class Preference { abstract val title: String abstract val enabled: Boolean - sealed class PreferenceItem : Preference() { + sealed class PreferenceItem : Preference() { abstract val subtitle: String? abstract val icon: ImageVector? - abstract val onValueChanged: suspend (value: T) -> Boolean + abstract val onValueChanged: suspend (value: T) -> R /** * A basic [PreferenceItem] that only displays texts. @@ -42,8 +42,8 @@ sealed class Preference { // <-- AY override val enabled: Boolean = true, val onClick: (() -> Unit)? = null, - ) : PreferenceItem() { - override val onValueChanged: suspend (value: String) -> Boolean = { true } + ) : PreferenceItem() { + override val onValueChanged: suspend (value: String) -> Unit = { } } /** @@ -55,7 +55,7 @@ sealed class Preference { override val subtitle: String? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: Boolean) -> Boolean = { true }, - ) : PreferenceItem() { + ) : PreferenceItem() { override val icon: ImageVector? = null } @@ -65,12 +65,13 @@ sealed class Preference { data class SliderPreference( val value: Int, override val title: String, + override val subtitle: String? = null, + val valueString: String? = null, val valueRange: IntProgression = 0..1, @IntRange(from = 0) val steps: Int = with(valueRange) { (last - first) - 1 }, - override val subtitle: String? = null, override val enabled: Boolean = true, - override val onValueChanged: suspend (value: Int) -> Boolean = { true }, - ) : PreferenceItem() { + override val onValueChanged: suspend (value: Int) -> Unit = { }, + ) : PreferenceItem() { override val icon: ImageVector? = null } @@ -88,7 +89,7 @@ sealed class Preference { override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: T) -> Boolean = { true }, - ) : PreferenceItem() { + ) : PreferenceItem() { internal fun internalSet(value: Any) = preference.set(value as T) internal suspend fun internalOnValueChanged(value: Any) = onValueChanged(value as T) @@ -109,8 +110,8 @@ sealed class Preference { { v, e -> subtitle?.format(e[v]) }, override val icon: ImageVector? = null, override val enabled: Boolean = true, - override val onValueChanged: suspend (value: String) -> Boolean = { true }, - ) : PreferenceItem() + override val onValueChanged: suspend (value: String) -> Unit = { }, + ) : PreferenceItem() /** * A [PreferenceItem] that displays a list of entries as a dialog. @@ -134,7 +135,7 @@ sealed class Preference { override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: Set) -> Boolean = { true }, - ) : PreferenceItem>() + ) : PreferenceItem, Boolean>() /** * A [PreferenceItem] that shows a EditText in the dialog. @@ -145,7 +146,7 @@ sealed class Preference { override val subtitle: String? = "%s", override val enabled: Boolean = true, override val onValueChanged: suspend (value: String) -> Boolean = { true }, - ) : PreferenceItem() { + ) : PreferenceItem() { override val icon: ImageVector? = null } @@ -162,7 +163,7 @@ sealed class Preference { override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: String) -> Boolean = { true }, - ) : PreferenceItem() + ) : PreferenceItem() /** * A [PreferenceItem] for editing MPV config files. @@ -200,7 +201,7 @@ sealed class Preference { } true }, - ) : PreferenceItem() + ) : PreferenceItem() /** * A [PreferenceItem] that shows a EditText with a subtitle in the dialog. @@ -216,7 +217,7 @@ sealed class Preference { override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: String) -> Boolean = { true }, - ) : PreferenceItem() + ) : PreferenceItem() // <-- AY /** @@ -226,12 +227,12 @@ sealed class Preference { val tracker: Tracker, val login: () -> Unit, val logout: () -> Unit, - ) : PreferenceItem() { + ) : PreferenceItem() { override val title: String = "" override val enabled: Boolean = true override val subtitle: String? = null override val icon: ImageVector? = null - override val onValueChanged: suspend (value: String) -> Boolean = { true } + override val onValueChanged: suspend (value: String) -> Unit = { } } // AM (CONNECTION) --> @@ -244,31 +245,31 @@ sealed class Preference { override val title: String, val login: () -> Unit, val openSettings: () -> Unit, - ) : PreferenceItem() { + ) : PreferenceItem() { override val enabled: Boolean = true override val subtitle: String? = null override val icon: ImageVector? = null - override val onValueChanged: suspend (newValue: String) -> Boolean = { true } + override val onValueChanged: suspend (newValue: String) -> Unit = { } } // <-- AM (CONNECTION) data class InfoPreference( override val title: String, override val enabled: Boolean = true, - ) : PreferenceItem() { + ) : PreferenceItem() { override val subtitle: String? = null override val icon: ImageVector? = null - override val onValueChanged: suspend (value: String) -> Boolean = { true } + override val onValueChanged: suspend (value: String) -> Unit = { } } data class CustomPreference( override val title: String, val content: @Composable () -> Unit, - ) : PreferenceItem() { + ) : PreferenceItem() { override val enabled: Boolean = true override val subtitle: String? = null override val icon: ImageVector? = null - override val onValueChanged: suspend (value: Unit) -> Boolean = { true } + override val onValueChanged: suspend (value: Unit) -> Unit = { } } } @@ -276,6 +277,6 @@ sealed class Preference { override val title: String, override val enabled: Boolean = true, - val preferenceItems: ImmutableList>, + val preferenceItems: ImmutableList>, ) : Preference() } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt index c710ed3218..b1be957495 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt @@ -39,7 +39,7 @@ val LocalPreferenceMinHeight = compositionLocalOf(structuralEqualityPolicy()) { @Composable fun StatusWrapper( - item: Preference.PreferenceItem<*>, + item: Preference.PreferenceItem<*, *>, highlightKey: String?, content: @Composable () -> Unit, ) { @@ -60,7 +60,7 @@ fun StatusWrapper( @Composable internal fun PreferenceItem( - item: Preference.PreferenceItem<*>, + item: Preference.PreferenceItem<*, *>, highlightKey: String?, ) { val scope = rememberCoroutineScope() @@ -87,17 +87,18 @@ internal fun PreferenceItem( } is Preference.PreferenceItem.SliderPreference -> { BaseSliderItem( - label = item.title, value = item.value, valueRange = item.valueRange, - valueText = item.subtitle.takeUnless { it.isNullOrEmpty() } ?: item.value.toString(), steps = item.steps, - labelStyle = MaterialTheme.typography.titleLarge.copy(fontSize = TitleFontSize), + title = item.title, + subtitle = item.subtitle, + valueString = item.valueString.takeUnless { it.isNullOrEmpty() } ?: item.value.toString(), onChange = { scope.launch { item.onValueChanged(it) } }, + titleStyle = MaterialTheme.typography.titleLarge.copy(fontSize = TitleFontSize), modifier = Modifier.padding( horizontal = PrefsHorizontalPadding, vertical = PrefsVerticalPadding, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceScreen.kt index 26b4086b86..e0938738fb 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceScreen.kt @@ -71,7 +71,7 @@ fun PreferenceScreen( } // Create Preference Item - is Preference.PreferenceItem<*> -> item { + is Preference.PreferenceItem<*, *> -> item { PreferenceItem( item = preference, highlightKey = highlightKey, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSearchScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSearchScreen.kt index 85b40752be..72effb2a88 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSearchScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSearchScreen.kt @@ -212,7 +212,7 @@ private fun SearchResult( emptySequence() } } - is Preference.PreferenceItem<*> -> sequenceOf(null to p) + is Preference.PreferenceItem<*, *> -> sequenceOf(null to p) } } // Don't show info preference diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt index 9e7f4c2988..effdf812d4 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt @@ -99,7 +99,7 @@ class DebugInfoScreen : Screen() { } private fun getDeviceInfoGroup(): Preference.PreferenceGroup { - val items = persistentListOf>().mutate { + val items = persistentListOf>().mutate { it.add( Preference.PreferenceItem.TextPreference( title = "Model", diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsAudioScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsAudioScreen.kt index 0b9ca3ca3a..a18a73f6cc 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsAudioScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsAudioScreen.kt @@ -91,11 +91,8 @@ object PlayerSettingsAudioScreen : SearchableSettings { value = boostCap, valueRange = 0..200, title = stringResource(AYMR.strings.pref_player_audio_boost_cap), - subtitle = boostCap.toString(), - onValueChanged = { - boostCapPref.set(it) - true - }, + valueString = boostCap.toString(), + onValueChanged = { boostCapPref.set(it) }, ), ) } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsPlayerScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsPlayerScreen.kt index 7ad7d77d78..9cf6f19b75 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsPlayerScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsPlayerScreen.kt @@ -186,11 +186,8 @@ object PlayerSettingsPlayerScreen : SearchableSettings { value = panelOpacity, valueRange = 0..100, title = stringResource(AYMR.strings.pref_panel_opacity), - subtitle = numberFormat.format(panelOpacity / 100f), - onValueChanged = { - panelOpacityPref.set(it) - true - }, + valueString = numberFormat.format(panelOpacity / 100f), + onValueChanged = { panelOpacityPref.set(it) }, ), ), ) diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt index de9d44c06c..0e35f2d334 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt @@ -59,6 +59,7 @@ import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.theme.header import tachiyomi.presentation.core.util.collectAsState +import tachiyomi.presentation.core.util.secondaryItemAlpha object SettingsItemsPaddings { val Horizontal = 24.dp @@ -178,7 +179,7 @@ fun SliderItem( label: String, onChange: (Int) -> Unit, steps: Int = with(valueRange) { (last - first) - 1 }, - valueText: String = value.toString(), + valueString: String = value.toString(), labelStyle: TextStyle = MaterialTheme.typography.bodyMedium, pillColor: Color = MaterialTheme.colorScheme.surfaceContainerHigh, ) { @@ -186,10 +187,10 @@ fun SliderItem( value = value, valueRange = valueRange, steps = steps, - label = label, - valueText = valueText, + title = label, + valueString = valueString, onChange = onChange, - labelStyle = labelStyle, + titleStyle = labelStyle, pillColor = pillColor, modifier = Modifier.padding( horizontal = SettingsItemsPaddings.Horizontal, @@ -202,12 +203,14 @@ fun SliderItem( fun BaseSliderItem( value: Int, valueRange: IntProgression, - label: String, + title: String, onChange: (Int) -> Unit, modifier: Modifier = Modifier, + subtitle: String? = null, steps: Int = with(valueRange) { (last - first) - 1 }, - valueText: String = value.toString(), - labelStyle: TextStyle = MaterialTheme.typography.bodyMedium, + valueString: String = value.toString(), + titleStyle: TextStyle = MaterialTheme.typography.titleLarge, + subtitleStyle: TextStyle = MaterialTheme.typography.bodySmall, pillColor: Color = MaterialTheme.colorScheme.surfaceContainerHigh, ) { val haptic = LocalHapticFeedback.current @@ -221,13 +224,21 @@ fun BaseSliderItem( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { - Text( - text = label, - style = labelStyle, - modifier = Modifier.weight(1f), - ) + Column(modifier = Modifier.weight(1f)) { + Text( + text = title, + style = titleStyle, + ) + if (subtitle != null) { + Text( + text = subtitle, + style = subtitleStyle, + modifier = Modifier.secondaryItemAlpha(), + ) + } + } Pill( - text = valueText, + text = valueString, style = MaterialTheme.typography.bodyMedium, color = pillColor, ) @@ -251,12 +262,16 @@ fun SliderItemPreview() { MaterialTheme(if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()) { var value by remember { mutableIntStateOf(0) } Surface { - SliderItem( + BaseSliderItem( value = value, valueRange = 0..10, - label = "Item per row", - valueText = if (value == 0) "Auto" else value.toString(), + title = "Item per row", + valueString = if (value == 0) "Auto" else value.toString(), onChange = { value = it }, + modifier = Modifier.padding( + horizontal = SettingsItemsPaddings.Horizontal, + vertical = SettingsItemsPaddings.Vertical, + ), ) } } From 06ede8fd7462fe6ac6ffdce5127b21df2344ad46 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 1 Nov 2025 12:48:18 +0000 Subject: [PATCH 22/82] Update markdown to v0.38.1 (#2636) (cherry picked from commit 7e880014b0f2c42bc430765a19068d93640ce603) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e4a33830cb..5f2b3ef033 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ voyager = "1.1.0-beta03" spotless = "8.0.0" ktlint-core = "1.7.1" firebase-bom = "34.5.0" -markdown = "0.37.0" +markdown = "0.38.1" junit = "6.0.1" [libraries] From 3348b595f9f6da469ecf372d755ad7f521f63605 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 20:12:32 +0100 Subject: [PATCH 23/82] Add option to customize concurrent downloads Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../more/settings/screen/SettingsDownloadScreen.kt | 7 +++++++ .../eu/kanade/tachiyomi/data/download/Downloader.kt | 11 +++++++---- .../domain/download/service/DownloadPreferences.kt | 2 ++ i18n/src/commonMain/moko-resources/base/strings.xml | 3 +++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDownloadScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDownloadScreen.kt index 8d870c8230..084c55c68b 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDownloadScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDownloadScreen.kt @@ -41,6 +41,7 @@ object SettingsDownloadScreen : SearchableSettings { val allCategories by getCategories.subscribe().collectAsState(initial = emptyList()) val downloadPreferences = remember { Injekt.get() } + val parallelSourceLimit by downloadPreferences.parallelSourceLimit().collectAsState() // AY --> val basePreferences = remember { Injekt.get() } // <-- AY @@ -49,6 +50,12 @@ object SettingsDownloadScreen : SearchableSettings { preference = downloadPreferences.downloadOnlyOverWifi(), title = stringResource(MR.strings.connected_to_wifi), ), + Preference.PreferenceItem.SliderPreference( + value = parallelSourceLimit, + valueRange = 1..10, + title = stringResource(MR.strings.pref_download_concurrent_sources), + onValueChanged = { downloadPreferences.parallelSourceLimit().set(it) }, + ), getDeleteEpisodesGroup( downloadPreferences = downloadPreferences, categories = allCategories, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt index c2f68fc648..248bb2035a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt @@ -193,15 +193,17 @@ class Downloader( if (isRunning) return downloaderJob = scope.launch { - val activeDownloadsFlow = queueState.transformLatest { queue -> + val activeDownloadsFlow = combine( + queueState, + downloadPreferences.parallelSourceLimit().changes(), + ) { a, b -> a to b }.transformLatest { (queue, parallelCount) -> while (true) { val activeDownloads = queue.asSequence() // Ignore completed downloads, leave them in the queue .filter { it.status.value <= Download.State.DOWNLOADING.value } .groupBy { it.source } .toList() - // Concurrently download from 5 different sources - .take(5) + .take(parallelCount) .map { (_, downloads) -> downloads.first() } emit(activeDownloads) @@ -213,7 +215,8 @@ class Downloader( }.filter { it } activeDownloadsErroredFlow.first() } - }.distinctUntilChanged() + } + .distinctUntilChanged() // Use supervisorScope to cancel child jobs when the downloader job is cancelled supervisorScope { diff --git a/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt b/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt index d96978ed68..11abf12295 100644 --- a/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt @@ -46,6 +46,8 @@ class DownloadPreferences( fun downloadNewUnseenEpisodesOnly() = preferenceStore.getBoolean("download_new_unseen_episodes_only", false) + fun parallelSourceLimit() = preferenceStore.getInt("download_parallel_source_limit", 5) + companion object { private const val REMOVE_EXCLUDE_CATEGORIES_PREF_KEY = "remove_exclude_categories" private const val DOWNLOAD_NEW_CATEGORIES_PREF_KEY = "download_new_categories" diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index 2ac6aff94b..6769184e93 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -521,6 +521,9 @@ Save as CBZ archive Split tall images Improves reader performance + Concurrent source downloads + Concurrent page downloads + Pages downloaded simultaneously per source Tracking guide From bb114fa89d83de8b3e27403bf1a27fe527368bff Mon Sep 17 00:00:00 2001 From: c2y5 <97918490+c2y5@users.noreply.github.com> Date: Sat, 1 Nov 2025 15:09:22 +0100 Subject: [PATCH 24/82] Fix extension download stuck at pending state in some cases (#2483) Also auto update extension list whenever a repository is added or removed Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> (cherry picked from commit 87c6f34a558b009be4d316e396ec3eeb4cfbbbf8) --- .../more/settings/screen/browse/ExtensionReposScreenModel.kt | 4 ++++ .../java/eu/kanade/tachiyomi/extension/ExtensionManager.kt | 2 +- .../tachiyomi/ui/browse/extension/ExtensionsScreenModel.kt | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/ExtensionReposScreenModel.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/ExtensionReposScreenModel.kt index 444f704abc..3c5212473c 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/ExtensionReposScreenModel.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/ExtensionReposScreenModel.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import dev.icerock.moko.resources.StringResource +import eu.kanade.tachiyomi.extension.ExtensionManager import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.channels.Channel @@ -27,6 +28,7 @@ class ExtensionReposScreenModel( private val deleteExtensionRepo: DeleteExtensionRepo = Injekt.get(), private val replaceExtensionRepo: ReplaceExtensionRepo = Injekt.get(), private val updateExtensionRepo: UpdateExtensionRepo = Injekt.get(), + private val extensionManager: ExtensionManager = Injekt.get(), ) : StateScreenModel(RepoScreenState.Loading) { private val _events: Channel = Channel(Int.MAX_VALUE) @@ -53,6 +55,7 @@ class ExtensionReposScreenModel( fun createRepo(baseUrl: String) { screenModelScope.launchIO { when (val result = createExtensionRepo.await(baseUrl)) { + CreateExtensionRepo.Result.Success -> extensionManager.findAvailableExtensions() CreateExtensionRepo.Result.InvalidUrl -> _events.send(RepoEvent.InvalidUrl) CreateExtensionRepo.Result.RepoAlreadyExists -> _events.send(RepoEvent.RepoAlreadyExists) is CreateExtensionRepo.Result.DuplicateFingerprint -> { @@ -93,6 +96,7 @@ class ExtensionReposScreenModel( fun deleteRepo(baseUrl: String) { screenModelScope.launchIO { deleteExtensionRepo.await(baseUrl) + extensionManager.findAvailableExtensions() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt index b34543a39a..1468a8e18d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt @@ -148,7 +148,7 @@ class ExtensionManager( } catch (e: Exception) { logcat(LogPriority.ERROR, e) withUIContext { context.toast(MR.strings.extension_api_error) } - emptyList() + return } enableAdditionalSubLanguages(extensions) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsScreenModel.kt index 9592f5239e..b259c8f327 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsScreenModel.kt @@ -174,6 +174,7 @@ class ExtensionsScreenModel( fun cancelInstallUpdateExtension(extension: Extension) { extensionManager.cancelInstallUpdateExtension(extension) + removeDownloadState(extension) } private fun addDownloadState(extension: Extension, installStep: InstallStep) { From 05dcf54c7cfb743dcdc3f02982e65c0ed327fb75 Mon Sep 17 00:00:00 2001 From: anirudhn Date: Sat, 1 Nov 2025 15:34:07 +0100 Subject: [PATCH 25/82] Fix scrollbar not showing when animator duration scale animation is turned off (#2398) (cherry picked from commit 09ec9fc8c54e126692ae68ff260058f3be46a5dd) --- .../core/components/VerticalFastScroller.kt | 12 ++++++------ .../tachiyomi/presentation/core/util/Scrollbar.kt | 8 +++++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/VerticalFastScroller.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/VerticalFastScroller.kt index 12b22ab9fe..269aebc588 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/VerticalFastScroller.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/VerticalFastScroller.kt @@ -47,6 +47,7 @@ import androidx.compose.ui.util.fastForEach import androidx.compose.ui.util.fastLastOrNull import androidx.compose.ui.util.fastMaxBy import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.sample @@ -177,7 +178,8 @@ fun VerticalFastScroller( .collectLatest { if (thumbAllowed()) { alpha.snapTo(1f) - alpha.animateTo(0f, animationSpec = FadeOutAnimationSpec) + delay(ScrollBarVisibilityDurationMillis) + alpha.animateTo(0f, animationSpec = ImmediateFadeOutAnimationSpec) } else { alpha.animateTo(0f, animationSpec = ImmediateFadeOutAnimationSpec) } @@ -366,7 +368,8 @@ fun VerticalGridFastScroller( .collectLatest { if (thumbAllowed()) { alpha.snapTo(1f) - alpha.animateTo(0f, animationSpec = FadeOutAnimationSpec) + delay(ScrollBarVisibilityDurationMillis) + alpha.animateTo(0f, animationSpec = ImmediateFadeOutAnimationSpec) } else { alpha.animateTo(0f, animationSpec = ImmediateFadeOutAnimationSpec) } @@ -460,10 +463,7 @@ object Scroller { private val ThumbLength = 48.dp private val ThumbThickness = 12.dp private val ThumbShape = RoundedCornerShape(ThumbThickness / 2) -private val FadeOutAnimationSpec = tween( - durationMillis = ViewConfiguration.getScrollBarFadeDuration(), - delayMillis = 2000, -) +private val ScrollBarVisibilityDurationMillis = 2000L private val ImmediateFadeOutAnimationSpec = tween( durationMillis = ViewConfiguration.getScrollBarFadeDuration(), ) diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt index 000915bdf7..4ea8c5989f 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt @@ -64,6 +64,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastFirstOrNull import androidx.compose.ui.util.fastSumBy import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.sample @@ -218,7 +219,8 @@ private fun Modifier.drawScrollbar( .sample(100) .collectLatest { alpha.snapTo(1f) - alpha.animateTo(0f, animationSpec = FadeOutAnimationSpec) + delay(ScrollBarVisibilityDurationMillis) + alpha.animateTo(0f, animationSpec = ImmediateFadeOutAnimationSpec) } } @@ -241,9 +243,9 @@ private fun Modifier.drawScrollbar( } } -private val FadeOutAnimationSpec = tween( +private val ScrollBarVisibilityDurationMillis = ViewConfiguration.getScrollDefaultDelay().toLong() +private val ImmediateFadeOutAnimationSpec = tween( durationMillis = ViewConfiguration.getScrollBarFadeDuration(), - delayMillis = ViewConfiguration.getScrollDefaultDelay(), ) @Preview(widthDp = 400, heightDp = 400, showBackground = true) From f2e7fe122deebedf63d6d05ad65b595b5c67dca3 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 20:19:12 +0100 Subject: [PATCH 26/82] Fix date picker not allowing the same start and finish date in negative time zones Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Co-authored-by: Kashish Aggarwal <73023696+kashish-aggarwal21@users.noreply.github.com> --- .../ui/anime/track/TrackInfoDialog.kt | 81 +++++++++---------- 1 file changed, 36 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/anime/track/TrackInfoDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/anime/track/TrackInfoDialog.kt index 274cb31dd6..e8577e727b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/anime/track/TrackInfoDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/anime/track/TrackInfoDialog.kt @@ -54,6 +54,7 @@ import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone +import eu.kanade.tachiyomi.util.lang.toLocalDate import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast @@ -220,7 +221,7 @@ data class TrackInfoDialogHomeScreen( try { val matchResult = item.tracker.match(anime) ?: throw Exception() item.tracker.register(matchResult, animeId) - } catch (e: Exception) { + } catch (_: Exception) { withUIContext { Injekt.get().toast(MR.strings.error_no_match) } } } @@ -446,56 +447,46 @@ private data class TrackDateSelectorScreen( @Transient private val selectableDates = object : SelectableDates { override fun isSelectableDate(utcTimeMillis: Long): Boolean { - val dateToCheck = Instant.ofEpochMilli(utcTimeMillis) - .atZone(ZoneOffset.systemDefault()) - .toLocalDate() + val targetDate = Instant.ofEpochMilli(utcTimeMillis).toLocalDate(ZoneOffset.UTC) - if (dateToCheck > LocalDate.now()) { - // Disallow future dates - return false - } + // Disallow future dates + if (targetDate > LocalDate.now(ZoneOffset.UTC)) return false - return if (start && track.finishDate > 0) { - // Disallow start date to be set later than finish date - val dateFinished = Instant.ofEpochMilli(track.finishDate) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - dateToCheck <= dateFinished - } else if (!start && track.startDate > 0) { - // Disallow end date to be set earlier than start date - val dateStarted = Instant.ofEpochMilli(track.startDate) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - dateToCheck >= dateStarted - } else { - // Nothing set before - true + return when { + // Disallow setting start date after finish date + start && track.finishDate > 0 -> { + val finishDate = Instant.ofEpochMilli(track.finishDate).toLocalDate(ZoneOffset.UTC) + targetDate <= finishDate + } + // Disallow setting finish date before start date + !start && track.startDate > 0 -> { + val startDate = Instant.ofEpochMilli(track.startDate).toLocalDate(ZoneOffset.UTC) + startDate <= targetDate + } + else -> { + true + } } } override fun isSelectableYear(year: Int): Boolean { - if (year > LocalDate.now().year) { - // Disallow future dates - return false - } - - return if (start && track.finishDate > 0) { - // Disallow start date to be set later than finish date - val dateFinished = Instant.ofEpochMilli(track.finishDate) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - .year - year <= dateFinished - } else if (!start && track.startDate > 0) { - // Disallow end date to be set earlier than start date - val dateStarted = Instant.ofEpochMilli(track.startDate) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - .year - year >= dateStarted - } else { - // Nothing set before - true + // Disallow future years + if (year > LocalDate.now(ZoneOffset.UTC).year) return false + + return when { + // Disallow setting start year after finish year + start && track.finishDate > 0 -> { + val finishDate = Instant.ofEpochMilli(track.finishDate).toLocalDate(ZoneOffset.UTC) + year <= finishDate.year + } + // Disallow setting finish year before start year + !start && track.startDate > 0 -> { + val startDate = Instant.ofEpochMilli(track.startDate).toLocalDate(ZoneOffset.UTC) + startDate.year <= year + } + else -> { + true + } } } } From 16c558391198c49bb81f05a8f14773c53051c5fc Mon Sep 17 00:00:00 2001 From: Trevor Paley <10186337+theunlocked@users.noreply.github.com> Date: Sun, 2 Nov 2025 07:23:01 +0100 Subject: [PATCH 27/82] Added proper multi window support in WebView instead of treating everything as a redirect (#2584) (cherry picked from commit 6ab87c793122165f98c36b4b7d9158069ea40f5a) --- .../webview/WebViewScreenContent.kt | 141 ++++++++++++++---- .../tachiyomi/util/system/WebViewUtil.kt | 3 + 2 files changed, 118 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt index 0e61e3d01c..48ae0004c5 100644 --- a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt +++ b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt @@ -2,6 +2,7 @@ package eu.kanade.presentation.webview import android.content.pm.ApplicationInfo import android.graphics.Bitmap +import android.os.Message import android.webkit.WebResourceRequest import android.webkit.WebView import androidx.compose.foundation.clickable @@ -19,6 +20,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -28,11 +30,14 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp +import cafe.adriel.voyager.core.stack.mutableStateStackOf +import com.kevinnzou.web.AccompanistWebChromeClient import com.kevinnzou.web.AccompanistWebViewClient import com.kevinnzou.web.LoadingState +import com.kevinnzou.web.WebContent import com.kevinnzou.web.WebView +import com.kevinnzou.web.WebViewState import com.kevinnzou.web.rememberWebViewNavigator -import com.kevinnzou.web.rememberWebViewState import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.WarningBanner @@ -44,6 +49,18 @@ import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource + +class WebViewWindow(webContent: WebContent) { + var state by mutableStateOf(WebViewState(webContent)) + var popupMessage: Message? = null + private set + var webView: WebView? = null + + constructor(popupMessage: Message) : this(WebContent.NavigatorOnly) { + this.popupMessage = popupMessage + } +} + @Composable fun WebViewScreenContent( onNavigateUp: () -> Unit, @@ -55,7 +72,26 @@ fun WebViewScreenContent( headers: Map = emptyMap(), onUrlChange: (String) -> Unit = {}, ) { - val state = rememberWebViewState(url = url, additionalHttpHeaders = headers) + val windowStack = remember { + mutableStateStackOf( + WebViewWindow( + WebContent.Url(url = url, additionalHttpHeaders = headers), + ), + ) + } + + val currentWindow = windowStack.lastItemOrNull!! + + val popState: (() -> Unit) = remember { + { + if (windowStack.size == 1) { + onNavigateUp() + } else { + windowStack.pop() + } + } + } + val navigator = rememberWebViewNavigator() val uriHandler = LocalUriHandler.current val scope = rememberCoroutineScope() @@ -116,14 +152,39 @@ fun WebViewScreenContent( } } + val webChromeClient = remember { + object : AccompanistWebChromeClient() { + override fun onCreateWindow( + view: WebView, + isDialog: Boolean, + isUserGesture: Boolean, + resultMsg: Message, + ): Boolean { + // if it wasn't initiated by a user gesture, we should ignore it like a normal browser would + if (isUserGesture) { + windowStack.push(WebViewWindow(resultMsg)) + return true + } + return false + } + } + } + + fun initializePopup(webView: WebView, message: Message): WebView { + val transport = message.obj as WebView.WebViewTransport + transport.webView = webView + message.sendToTarget() + return webView + } + Scaffold( topBar = { Box { Column { AppBar( - title = state.pageTitle ?: initialTitle, + title = currentWindow.state.pageTitle ?: initialTitle, subtitle = currentUrl, - navigateUp = onNavigateUp, + navigateUp = popState, navigationIcon = Icons.Outlined.Close, actions = { AppBarActions( @@ -186,7 +247,7 @@ fun WebViewScreenContent( } } } - when (val loadingState = state.loadingState) { + when (val loadingState = currentWindow.state.loadingState) { is LoadingState.Initializing -> LinearProgressIndicator( modifier = Modifier .fillMaxWidth() @@ -203,27 +264,55 @@ fun WebViewScreenContent( } }, ) { contentPadding -> - WebView( - state = state, - modifier = Modifier - .fillMaxSize() - .padding(contentPadding), - navigator = navigator, - onCreated = { webView -> - webView.setDefaultSettings() - - // Debug mode (chrome://inspect/#devices) - if (BuildConfig.DEBUG && - 0 != webView.context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE - ) { - WebView.setWebContentsDebuggingEnabled(true) - } + // We need to key the WebView composable to the window object since simply updating the WebView composable will + // not cause it to re-invoke the WebView factory and render the new current window's WebView. This lets us + // completely reset the WebView composable when the current window switches. + key(currentWindow) { + WebView( + state = currentWindow.state, + modifier = Modifier + .fillMaxSize() + .padding(contentPadding), + navigator = navigator, + onCreated = { webView -> + webView.setDefaultSettings() - headers["user-agent"]?.let { - webView.settings.userAgentString = it - } - }, - client = webClient, - ) + // Debug mode (chrome://inspect/#devices) + if (BuildConfig.DEBUG && + 0 != webView.context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE + ) { + WebView.setWebContentsDebuggingEnabled(true) + } + + headers["user-agent"]?.let { + webView.settings.userAgentString = it + } + }, + onDispose = { webView -> + val window = windowStack.items.find { it.webView == webView } + if (window == null) { + // If we couldn't find any window on the stack that owns this WebView, it means that we can + // safely dispose of it because the window containing it has been closed. + webView.destroy() + } else { + // The composable is being disposed but the WebView object is not. + // When the WebView element is recomposed, we will want the WebView to resume from its state + // before it was unmounted, we won't want it to reset back to its original target. + window.state = WebViewState(WebContent.NavigatorOnly) + } + }, + client = webClient, + chromeClient = webChromeClient, + factory = { context -> + currentWindow.webView + ?: WebView(context).also { webView -> + currentWindow.webView = webView + currentWindow.popupMessage?.let { + initializePopup(webView, it) + } + } + }, + ) + } } } diff --git a/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/WebViewUtil.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/WebViewUtil.kt index a66ca6994c..0ca4361f8e 100644 --- a/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/WebViewUtil.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/WebViewUtil.kt @@ -83,6 +83,9 @@ fun WebView.setDefaultSettings() { loadWithOverviewMode = true cacheMode = WebSettings.LOAD_DEFAULT + // Handle popups properly + setSupportMultipleWindows(true) + // Allow zooming setSupportZoom(true) builtInZoomControls = true From fdc40119c92e2bb1364ba2befa2d4ae0c8938f64 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 20:22:24 +0100 Subject: [PATCH 28/82] Make reader edge-to-edge Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- app/build.gradle.kts | 1 - .../tachiyomi/util/system/DisplayExtensions.kt | 17 ----------------- gradle/libs.versions.toml | 1 - 3 files changed, 19 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fea141b6e3..190780bc88 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -276,7 +276,6 @@ dependencies { // implementation(libs.directionalviewpager) { // exclude(group = "androidx.viewpager", module = "viewpager") // } - // implementation(libs.insetter) // <-- AM (REMOVE_LIBRARIES) implementation(libs.richeditor.compose) implementation(libs.aboutLibraries.compose) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/DisplayExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/DisplayExtensions.kt index f051ccbc86..08f230b75e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/DisplayExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/DisplayExtensions.kt @@ -47,23 +47,6 @@ fun Context.prepareTabletUiContext(): Context { return this } -/** - * Returns true if current context is in night mode - */ -fun Context.isNightMode(): Boolean { - return resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES -} - -/** - * Checks whether if the device has a display cutout (i.e. notch, camera cutout, etc.). - * - * Only works in Android 9+. - */ -fun Activity.hasDisplayCutout(): Boolean { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && - window.decorView.rootWindowInsets?.displayCutout != null -} - /** * Gets system's config_navBarNeedsScrim boolean flag added in Android 10, defaults to true. */ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5f2b3ef033..a0703d1fa8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -60,7 +60,6 @@ material = "com.google.android.material:material:1.12.0" flexible-adapter-core = "com.github.arkon.FlexibleAdapter:flexible-adapter:c8013533" photoview = "com.github.chrisbanes:PhotoView:2.3.0" directionalviewpager = "com.github.tachiyomiorg:DirectionalViewPager:1.0.0" -insetter = "dev.chrisbanes.insetter:insetter:0.6.1" compose-materialmotion = "io.github.fornewid:material-motion-compose-core:2.0.1" compose-webview = "io.github.kevinnzou:compose-webview:0.33.6" compose-grid = "io.woong.compose.grid:grid:1.2.2" From ae60381a605683b6b0e28035b661c5b6435bfac0 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sun, 2 Nov 2025 14:46:06 +0100 Subject: [PATCH 29/82] Translations update from Hosted Weblate (#2373) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/ar/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/hi/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/jv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/ko/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/ms/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/pt/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/sk/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/tr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ar/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/de/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/el/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/eo/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/es/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/fil/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/fr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/hi/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/hr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/id/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ja/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/jv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ko/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ms/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ne/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/nl/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/pt/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ro/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ru/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sk/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/th/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/tr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/vi/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/zh_Hant/ Translation: Mihon/Mihon Translation: Mihon/Mihon Plurals Co-authored-by: Dexroneum Co-authored-by: Efe Akın Co-authored-by: Evan Jones (原文轩) Co-authored-by: Farith Co-authored-by: Frosted Co-authored-by: Infy's Tagalog Translations Co-authored-by: Itsmechinmoy <167056923+itsmechinmoy@users.noreply.github.com> Co-authored-by: Itsmechinmoy Co-authored-by: Jakub Fabijan Co-authored-by: Lyfja <45209212+lyfja@users.noreply.github.com> Co-authored-by: Madddog1997 Co-authored-by: Manjul Tamrakar Co-authored-by: Manuela Silva Co-authored-by: Milo Ivir Co-authored-by: Mohamed kh Co-authored-by: MuhamadSyabitHidayattulloh Co-authored-by: Nataniel Dika Kurniawan Co-authored-by: Omgeta Co-authored-by: Pitpe11 Co-authored-by: Saft Octavian Co-authored-by: Siebrenvde Co-authored-by: Swyter Co-authored-by: TheKingTermux <50316075+TheKingTermux@users.noreply.github.com> Co-authored-by: Throw Away Co-authored-by: ZerOriSama Co-authored-by: keegang 6705 Co-authored-by: ssantos Co-authored-by: ɴᴇᴋᴏ Co-authored-by: 안세훈 (cherry picked from commit 860955389661ce35d37f499efdd27259b93d8e56) --- .../commonMain/moko-resources/ar/plurals.xml | 26 ++- .../commonMain/moko-resources/ar/strings.xml | 57 ++++- .../commonMain/moko-resources/de/strings.xml | 8 +- .../commonMain/moko-resources/el/strings.xml | 8 +- .../commonMain/moko-resources/eo/strings.xml | 8 +- .../commonMain/moko-resources/es/strings.xml | 6 +- .../commonMain/moko-resources/fil/strings.xml | 8 +- .../commonMain/moko-resources/fr/strings.xml | 11 +- .../commonMain/moko-resources/hi/plurals.xml | 16 +- .../commonMain/moko-resources/hi/strings.xml | 219 +++++++++++++++++- .../commonMain/moko-resources/hr/strings.xml | 38 +-- .../commonMain/moko-resources/in/strings.xml | 58 ++++- .../commonMain/moko-resources/ja/strings.xml | 30 ++- .../commonMain/moko-resources/jv/plurals.xml | 51 +++- .../commonMain/moko-resources/jv/strings.xml | 31 +-- .../commonMain/moko-resources/ko/plurals.xml | 15 ++ .../commonMain/moko-resources/ko/strings.xml | 107 ++++++++- .../commonMain/moko-resources/ms/plurals.xml | 15 ++ .../commonMain/moko-resources/ms/strings.xml | 142 +++++++++++- .../commonMain/moko-resources/ne/strings.xml | 12 + .../commonMain/moko-resources/nl/strings.xml | 84 ++++++- .../commonMain/moko-resources/pt/plurals.xml | 5 + .../commonMain/moko-resources/pt/strings.xml | 105 +++++---- .../commonMain/moko-resources/ro/strings.xml | 76 +++++- .../commonMain/moko-resources/ru/strings.xml | 6 +- .../commonMain/moko-resources/sk/plurals.xml | 18 ++ .../commonMain/moko-resources/sk/strings.xml | 1 + .../commonMain/moko-resources/th/strings.xml | 5 +- .../commonMain/moko-resources/tr/plurals.xml | 4 +- .../commonMain/moko-resources/tr/strings.xml | 14 +- .../commonMain/moko-resources/vi/strings.xml | 4 +- .../moko-resources/zh-rCN/strings.xml | 12 +- .../moko-resources/zh-rTW/strings.xml | 8 +- 33 files changed, 1018 insertions(+), 190 deletions(-) diff --git a/i18n/src/commonMain/moko-resources/ar/plurals.xml b/i18n/src/commonMain/moko-resources/ar/plurals.xml index 2af58ef59c..b50f7af97d 100644 --- a/i18n/src/commonMain/moko-resources/ar/plurals.xml +++ b/i18n/src/commonMain/moko-resources/ar/plurals.xml @@ -105,7 +105,7 @@ %d فصل تالٍ لم يُقرؤوا - الفصل التالي + لا فصل تالي الفصل التالي %d فصول تالية %d فصول تالية @@ -152,4 +152,28 @@ بعد %1$d أيام بعد %1$d أيام + + نقل %1$d مدخل + نقل %1$d مدخل + نقل %1$d مدخل + نقل %1$d مدخل + نقل %1$d مدخل + نقل %1$d مدخل + + + نسخ %1$d مدخل؟ + نسخ %1$d مدخل؟ + نسخ %1$d مدخل؟ + نسخ %1$d مدخل؟ + نسخ %1$d مدخل؟ + نسخ %1$d مدخل؟ + + + لا مدخل ثم تجاوزه + مدخل ثم تجاوزه + مدخلان ثم تجاوزه + %1$d مدخل ثم تجاوزه + %1$d مدخل ثم تجاوزه + %1$d مدخل ثم تجاوزه + diff --git a/i18n/src/commonMain/moko-resources/ar/strings.xml b/i18n/src/commonMain/moko-resources/ar/strings.xml index 171a098819..4dba0dfe8d 100644 --- a/i18n/src/commonMain/moko-resources/ar/strings.xml +++ b/i18n/src/commonMain/moko-resources/ar/strings.xml @@ -555,7 +555,7 @@ %1$d مدخلةً في قاعدة البيانات وليست في المكتبة فشل الحصول على قائمة الملحقات ثبِّت «شيزوكو» وشغِّله لتستخدمه مثبِّت إضافات. - تحذير: يمكن أن تؤدِّي التنزيلات كبيرة الحجم والعدد إلى إبطاء المصادر، وقد يُحظر Mihon منها بسبب ذلك. اضغط لمعرفة المزيد۔ + %sتحذير: يمكن أن تؤدِّي التنزيلات كبيرة الحجم والعدد إلى إبطاء المصادر، وقد يُحظر %s منها بسبب ذلك. اضغط لمعرفة المزيد۔ إظهار الدخول شبكة بالاغلفة تُخُطِّيت بسبب عدم وجود فصول قُرئت @@ -737,7 +737,7 @@ خيارات أكثر محدَّد غير مُحدَّد - إصعد + تصفح الاعلى مكان التخزين يُستخدَم في الاحتياط وتنزيل الفصول والمصدر المحليِّ. حدِّد مجلَّدًا @@ -847,9 +847,60 @@ قائمة المكتبات جميع الإدخالات المقروئة عتبة خريطة الصورة النقطية للأجهزة المخصصة - اساس(%d) + افتراضي (%d) لديك مداخلات متشابهة في مكتبك بنفس الاسم.\nحدد واحدة للنقل أو الإضافة على أي حال التكرارات المحتملة تحديث المتابعات إلى الفصل %d؟ إيقاف قراءة التاريخ مؤقتًا للتمديد + تبرع + كاتبوتشين + ­تقديم الصور في أوصاف المانجا + إخفاء مؤشرات الفصل المفقودة + يؤثر على الأداء. فعّله فقط إذا لم يُحل تقليل عتبة الخريطة النقطية مشاكل الصورة الفارغة. + تخطي تنزيل الفصول المقروءة المكررة + تحديث التقدم عند وضع علامة عليه كمقروء + يصدّر + تم تصدير المكتبة + أنت على وشك إزالة الإدخالات من قاعدة البيانات + سيتم فقدان قراءة الفصول وتقدم الإدخالات غير الموجودة في المكتبة + الاحتفاظ بالإدخالات مع الفصول المقروءة + تم تعقبها بشكل خاص + مُختار + متاح + تحديد الكل + لا تحدد + ­حدد المصادر الممكنة + تحديد المصادر المثبتة + اكمل + البيانات المراد نقلها + حذف التنزيلات الخاصة بالإدخال الحالي بعد الترحيل + ­كلمات رئيسية إضافية (اختياري) + يساعد في تضييق نتائج البحث عن طريق إضافة كلمات رئيسية إضافية + إخفاء الإدخالات التي لا تحتوي على تطابق + إخفاء الإدخالات بدون فصول أحدث + إظهار الإدخال فقط إذا كانت المباراة تحتوي على فصول إضافية + هذه الخيارات بطيئة وخطيرة وقد تؤدي إلى فرض قيود من المصادر + وضع البحث المتقدم + يقسم العنوان إلى كلمات رئيسية لإجراء بحث أوسع + المطابقة على أساس رقم الفصل + في حال تفعيله، يتم اختيار المطابقة الأبعد. وإلا، يتم اختيار المطابقة الأولى حسب أولوية المصدر. + ‎نقل + نقل (%1$d/%2$d) + قطع + نقل + لم يتم العثور على بدائل + الأحدث: %1$s + مجهول + البحث اليدوي + لا تنقل + نقل الآن + نسخ الآن + وقف النقل؟ + إيقاف + إلغاء + نسخ + نقل + إلغاء + إلغاء + لم يتم العثور على فصول، لا يمكن استخدام هذا الإدخال للنقل diff --git a/i18n/src/commonMain/moko-resources/de/strings.xml b/i18n/src/commonMain/moko-resources/de/strings.xml index 8475b98b9b..638c6a9b3e 100644 --- a/i18n/src/commonMain/moko-resources/de/strings.xml +++ b/i18n/src/commonMain/moko-resources/de/strings.xml @@ -204,7 +204,7 @@ Wähle ein Vorschaubild Wähle eine Sicherungsdatei Herunterladen - Keine neues Update verfügbar + Kein neues Update verfügbar Herunterladen… Tippe, um das Update zu installieren Fehler beim Herunterladen @@ -542,7 +542,7 @@ Du solltest Kopien der Datensicherungen auch an anderen Orten aufbewahren. Datensicherungen beinhalten möglicherweise sensible Daten, einschließlich gespeicherter Passwörter. Sei vorsichtig beim Teilen. Nur über WLAN Alle 3 Tage - Achtung: Große Downloads könnten dazu führen, dass Quellen langsamer werden und/oder Mihon blockieren. Tippe, um mehr zu erfahren. + Achtung: Große Downloads könnten dazu führen, dass Quellen langsamer werden und/oder %s blockieren. Tippe um mehr zu erfahren. Alle aktualisieren App-Updates Kapitel-Zwischenspeicher beim Öffnen der App löschen @@ -778,7 +778,7 @@ Speicherleitfaden Intelligentes Aktualisieren Repository-URL - Füge zusätzliche Repositorys zu Mihon hinzu. Deren URLs sollten mit „index.min.json“ enden. + Füge zusätzliche Repositorys zu %s hinzu. Deren URLs sollten mit „index.min.json“ enden. Ungültige Repository-URL Ca. %1$s bis zur Veröffentlichung neuer Kapitel, wird ca. alle %2$s überprüft. Nord @@ -903,4 +903,6 @@ Keine Kapitel gefunden, dieser Eintrag konnte nicht für eine Migration verwendet werden Spenden Bilder in Mangabeschreibungen anzeigen + Nicht-ASCII-Dateinamen nicht zulassen + Versichert Kompatibilität mit bestimmten Speichermedien, die Unicode nicht unterstützen. Ist diese Option aktiviert, müssen Quellen- und Manga-Ordner manuell umbenannt werden, indem Nicht-ASCII-Zeichen durch ihre UTF-8-Hexadezimaldarstellungen in Kleinbuchstaben ersetzt werden. Kapiteldateien müssen nicht umbenannt werden. diff --git a/i18n/src/commonMain/moko-resources/el/strings.xml b/i18n/src/commonMain/moko-resources/el/strings.xml index 86ea49aa9d..0288ea8de2 100644 --- a/i18n/src/commonMain/moko-resources/el/strings.xml +++ b/i18n/src/commonMain/moko-resources/el/strings.xml @@ -542,7 +542,7 @@ Οι μεγάλες ενημερώσεις βλάπτουν τις πηγές και μπορεί να οδηγήσουν σε πιο αργές ενημερώσεις και σε αυξημένη χρήση της μπαταρίας. Πατήστε για να μάθετε περισσότερα. Μόνο σε Wi-Fi Κάθε 3 ημέρες - Προειδοποίηση: οι μαζικές λήψεις ενδέχεται να οδηγήσουν σε επιβράδυνση των πηγών ή/και αποκλεισμό του Mihon. Πατήστε για να μάθετε περισσότερα. + Προειδοποίηση: οι μαζικές λήψεις ενδέχεται να οδηγήσουν σε επιβράδυνση των πηγών ή/και αποκλεισμό του %s. Πατήστε για να μάθετε περισσότερα. Ενημέρωση όλων Ενημερώσεις εφαρμογής Εκκαθάριση της προσωρινής μνήμης κεφαλαίων κατά την εκκίνηση της εφαρμογής @@ -779,7 +779,7 @@ Nord Έξυπνη ενημέρωση URL αποθετηρίου - Προσθέστε επιπλέον αποθετήρια στο Mihon. Αυτό θα πρέπει να είναι ένα URL που τελειώνει με \"index.min.json\". + Προσθέστε επιπλέον αποθετήρια στο %s. Αυτό θα πρέπει να είναι ένα URL που τελειώνει με \"index.min.json\". Θέλετε να διαγράψετε το αποθετήριο \"%s\"; Αυτό το αποθετήριο υπάρχει ήδη! Σύντομα @@ -901,4 +901,8 @@ Κρατήστε καταχωρήσεις με αναγνωσμένα κεφάλαια Αποτυχία δημιουργίας καταλόγου λήψης Αποτυχία δημιουργίας καταλόγου: %s + Δωρεά + Αναπαράσταση εικόνων σε περιγραφές manga + Απαγόρευση μη ASCII ονομάτων αρχείων + Εξασφαλίζει συμβατότητα με ορισμένα μέσα αποθήκευσης που δεν υποστηρίζουν Unicode. Όταν αυτή η επιλογή είναι ενεργοποιημένη, θα πρέπει να μετονομάσετε χειροκίνητα τους φακέλους πηγής και manga, αντικαθιστώντας τους χαρακτήρες που δεν είναι ASCII με τις μικρές κεφαλαίες δεκαεξαδικές αναπαραστάσεις UTF-8. Τα αρχεία κεφαλαίων δε χρειάζεται να μετονομάζονται. diff --git a/i18n/src/commonMain/moko-resources/eo/strings.xml b/i18n/src/commonMain/moko-resources/eo/strings.xml index b3cf3afd1d..e94087a9fb 100644 --- a/i18n/src/commonMain/moko-resources/eo/strings.xml +++ b/i18n/src/commonMain/moko-resources/eo/strings.xml @@ -372,7 +372,7 @@ Nevalida ĉapitra formato Ĉapitro netrovita Loka fonto - Ĝisdatigi kategorion + Ĝisdatigado de kategorio Kontroli ĝisdatigojn Helpu traduki Savkopia restaŭro @@ -592,7 +592,7 @@ Defaŭlta (%d) Se legilo ŝargas malplenan bildon alkremente redukti la sojlon.\nElektita: %s Deponeja URL - Aldoni aldonajn deponejojn al Mihon. Ĉi tio estu URL kiu finas per \"index.min.json\". + Aldoni aldonajn deponejojn al %s. Ĉi tio estu URL kiu finas per \"index.min.json\". Ĉi tiu deponejo jam ekzistas! Ĉu vi volas forigi la deponejon \"%s\"? Instali kaj lanĉi Shizuku-n por uzi Shizuku-n kiel etendaĵa instalilo. @@ -812,7 +812,7 @@ %dh %dm %ds - Averto: grandaj amasaj elŝutoj povas igi fontojn fariĝi pli malrapidaj kaj/aŭ bloki Mihon. Tuŝetu por ekscii pli. + Averto: grandaj amasaj elŝutoj povas igi fontojn fariĝi pli malrapidaj kaj/aŭ bloki %s. Tuŝetu por ekscii pli. Ĝisdatigado de biblioteko… (%s) Grandaj ĝisdatigoj povas damaĝi fontojn kaj konduki al pli malrapidaj ĝisdatigoj kaj pliigan baterian uzadon. Tuŝetu por ekscii pli. %1$d ĝisdatigo(j) fiaskis @@ -894,4 +894,6 @@ Montri bildojn en mangaaj priskriboj Kaŝi mankantajn ĉapitrajn indikilojn Sekvata private + Malpermesi ne-ASCII-dosiernomojn + Certigas kongruon kun certaj konservejaj dosiersistemoj kiuj ne subtenas Unikodon. Kiam tio estas ŝaltita, vi bezonos permane renomi dosierujojn de fontoj kaj mangaoj anstataŭigante ne-ASCII-signojn per iliaj minusklaj UTF-8-deksesumaj prezentoj. Ĉapitraj dosieroj ne necesas esti renomitaj. diff --git a/i18n/src/commonMain/moko-resources/es/strings.xml b/i18n/src/commonMain/moko-resources/es/strings.xml index 546d7d182c..62899dd2dc 100644 --- a/i18n/src/commonMain/moko-resources/es/strings.xml +++ b/i18n/src/commonMain/moko-resources/es/strings.xml @@ -540,7 +540,7 @@ Es una buena idea tener copias de respaldo fuera de tu dispositivo. Ten en cuenta que incluyen contraseñas y otros datos privados que seguramente no quieras compartir. Solo con Wi-Fi Cada 3 días - Advertencia: Las descargas grandes pueden llevar a que las fuentes se vuelvan cada vez más lentas y en casos extremos que los servidores limiten o impidan el acceso a Mihon. Toca aquí para más información. + Advertencia: Las descargas grandes pueden llevar a que las fuentes se vuelvan cada vez más lentas y en casos extremos que los servidores limiten o impidan el acceso a %s. Toca aquí para más información. Actualizar todas Actualizaciones de la aplicación Limpiar la caché de capítulos al abrir la aplicación @@ -766,7 +766,7 @@ ¡Este repositorio ya existe! Actualizaciones inteligentes La dirección URL del repositorio no parece ser correcta - Añade más repositorios a Mihon; la dirección URL tiene que terminar en «index.min.json». + Añade más repositorios a %s; la dirección URL tiene que terminar en «index.min.json». ¿Seguro que quieres borrar el repositorio «%s»? Borrar repositorio Añadir un repositorio @@ -896,4 +896,6 @@ Ocultar los indicadores de capítulos que falten Donar Ver imágenes en las descripciones de manga + Prohibir los nombres de archivo que no sean ASCII + Permite guardar tus datos en ciertos tipos de almacenamiento que no admitan Unicode. Al activarlo tendrás que renombrar las carpetas de tus fuentes y manga, pasándolas a representaciones UTF-8 en hexadecimal en minúscula. No tienes que hacer lo mismo con las carpetas de capítulos. diff --git a/i18n/src/commonMain/moko-resources/fil/strings.xml b/i18n/src/commonMain/moko-resources/fil/strings.xml index d295b94fa6..8bfa7cacd9 100644 --- a/i18n/src/commonMain/moko-resources/fil/strings.xml +++ b/i18n/src/commonMain/moko-resources/fil/strings.xml @@ -426,7 +426,7 @@ Nabura ang kasaysayan Sigurado ka ba talaga? Mawawala ang buong kasaysayan. Gabay sa Paglipat ng source - Abante + Susunod na pahina Balik Walang nakitang file picker app Ipakita sa mga listahan ng source at extension @@ -542,7 +542,7 @@ Dapat nagtatabi rin kayo ng mga kopya ng backup sa ibang mga lugar. Ang mga backup ay naglalaman ng sensitibong data tulad ng nakaimbak na password; mag-ingat kung ibahagi ito. Sa Wi-Fi lang Kada 3 araw - Babala: maaaring humantong sa pagbagal at/o pagharang ng mga source sa Mihon ang maramihang pag-download. I-tap para matuto pa. + Babala: maaaring humantong sa pagbagal at/o pagharang ng mga source sa %s ang maramihang pag-download. I-tap para matuto pa. Mga update sa app I-update lahat %1$d na entry sa database na wala sa aklatan @@ -777,7 +777,7 @@ Umiiral na ang repo na ito! Tanggalin ang repo URL ng repo - Magdagdag ng mga karagdagang repo sa Mihon. Dapat ito ay isang URL na nagtatapos sa \"index.min.json\". + Magdagdag ng mga karagdagang repo sa %s. Dapat ito ay isang URL na nagtatapos sa \"index.min.json\". Di-wastong URL ng repo Gusto mo bang tanggalin ang repo na \"%s\"? Custom na frequency sa pag-update: @@ -901,4 +901,6 @@ Itago ang mga indikasyon ng nawawalang kabanata I-render ang mga imahe sa mga paglalarawan ng manga Mag-donate + Di-payagan ang mga non-ASCII na filename + Tinitiyak ang pagiging tugma sa ilang partikular na storage media na hindi sumusuporta sa Unicode. Kapag napagana ito, kakailanganin mong manu-manong palitan ang pangalan ng source at manga folder sa pamamagitan ng pagpapalit ng mga hindi ASCII na character ng kanilang lowercase na UTF-8 hexadecimal na representasyon. Hindi kailangang palitan ng pangalan ang mga file ng kabanata. diff --git a/i18n/src/commonMain/moko-resources/fr/strings.xml b/i18n/src/commonMain/moko-resources/fr/strings.xml index 3612528e7f..ce7568179d 100644 --- a/i18n/src/commonMain/moko-resources/fr/strings.xml +++ b/i18n/src/commonMain/moko-resources/fr/strings.xml @@ -452,7 +452,7 @@ Inverser le placement des pages divisées Vous devrez installer les extensions manquantes et vous connecter ensuite aux services de suivi pour les utiliser. Précédent - DNS over HTTPS (DoH) + DNS sur HTTPS (DoH) Droite Gauche Suivant @@ -542,7 +542,7 @@ Vous devez également conserver des copies des sauvegardes à d\'autres endroits. Uniquement en Wi-Fi Tous les 3 jours - Attention : les téléchargements massifs peuvent entraîner un ralentissement des sources ou le blocage de Mihon. Appuyez pour en savoir plus. + Attention : les téléchargements massifs peuvent entraîner un ralentissement des sources ou le blocage de %s. Appuyez pour en savoir plus. Tout mettre à jour Mises à jour de l\'application Vider le cache de chapitre au lancement de l\'application @@ -717,7 +717,7 @@ Plus d\'options Sélectionné Pas sélectionné(e) - Scanlator + Scanlateur Flash lors du changement de page Naviguer vers le haut Score du service de suivi @@ -769,7 +769,7 @@ Répertoire d\'extension Révoquer les extensions provenant d\'un répertoire additionnel URL du répertoire - Ajouter un répertoire additionnel à Mihon. L\'URL devrait se terminer par « index.min.json ». + Ajouter un répertoire additionnel à %s. L\'URL devrait se terminer par « index.min.json ». Ce répertoire existe déjà ! L\'URL du répertoire est invalide Bientôt @@ -796,7 +796,7 @@ Le mois précédent Copier le lien L\'empreinte digitale de la clé de signature existe déjà - Souhaitez-vous ajouter le répertoire \"%s\"? + Souhaitez-vous ajouter le répertoire \"%s\" ? Flash avec Le répertoire %1$s a la même empreinte digitale de la clé de signature que %2$s. \nSi cela est attendu, %2$s sera remplacé, sinon contactez votre mainteneur du répertoire. @@ -902,4 +902,5 @@ Annuler Annuler Donation + Rendre les images dans les descriptions de mangas diff --git a/i18n/src/commonMain/moko-resources/hi/plurals.xml b/i18n/src/commonMain/moko-resources/hi/plurals.xml index 5169539ca8..c35ac160b8 100644 --- a/i18n/src/commonMain/moko-resources/hi/plurals.xml +++ b/i18n/src/commonMain/moko-resources/hi/plurals.xml @@ -29,8 +29,8 @@ %d श्रेणियाँ - %1$s में %2$s त्रुटि के साथ किया गया - %1$s में %2$s त्रुटियों के साथ किया गया + %1$s में पूर्ण, %2$s त्रुटि सहित + %1$s में पूर्ण, %2$s त्रुटियों सहित %1$s अध्याय @@ -76,4 +76,16 @@ %1$s अध्याय गायब है %1$s अध्याय गायब हैं + + %1$d एंट्री ट्रांसफ़र करें? + %1$d एंट्रियाँ ट्रांसफ़र करें? + + + %1$d एंट्री कॉपी करें? + %1$d एंट्रियाँ कॉपी करें? + + + एक प्रविष्टि त्यागी गई + %1$d प्रविष्टियाँ त्यागी गईं + diff --git a/i18n/src/commonMain/moko-resources/hi/strings.xml b/i18n/src/commonMain/moko-resources/hi/strings.xml index 1519fd7101..d4a259a203 100644 --- a/i18n/src/commonMain/moko-resources/hi/strings.xml +++ b/i18n/src/commonMain/moko-resources/hi/strings.xml @@ -67,7 +67,7 @@ पदचिह्न विकसित संबंध में - ग्रिड आकार + प्रति पंक्ति आइटम्स चित्र लैंडस्केप स्वचालित अद्यतन @@ -118,10 +118,10 @@ मुक्त सीधे बंद मजबूर लैंडस्केप - R - G - B - A + लाल + हरा + नीला + पारदर्शिता \'पढ़ें\' के रूप में खुद से चिह्नित करने के बाद पढ़ने के बाद स्वचालित रूप से हटाएं बंद करें @@ -542,7 +542,7 @@ चेतावनी भाषा आपको अन्य स्थानों पर भी बैकअप की प्रतियाँ रखनी चाहिए। - चेतावनी: बड़े बल्क डाउनलोड के कारण स्रोत धीमे हो सकते हैं। और/या ताचियोमी को ब्लॉक कर सकते हैं। अधिक जानने के लिए यह टैप करें । + चेतावनी: बड़े पैमाने पर डाउनलोड से स्रोत धीमे हो सकते हैं और/या %s को ब्लॉक कर सकते हैं। अधिक जानने के लिए टैप करें। बड़े अपडेट स्रोतों को नुकसान पहुंचाते हैं और इससे धीमे अपडेट हो सकते हैं, और बैटरी का उपयोग भी बढ़ सकता है। अधिक जानने के लिए टैप करें । ऐप अपडेट हर 3 दिन @@ -648,16 +648,16 @@ अंतराल निर्धारित करें अनुकूलित लाने का अंतराल अंतराल - दाईं ओर स्वाइप करने पर + अध्यााय: दाएँ स्वाइप करें अगला अपेक्षित अपडेट डीबग जानकारी डंप क्रैश लॉग, बैटरी अनुकूलन अपेक्षित रिलीज़ अवधि से बाहर - बाईं ओर स्वाइप करने पर + अध्यााय: बाएँ स्वाइप करें लाइब्रेरी सिंक पूरा डाउनलोड अनुक्रमणिका अमान्य ठीक है - डाउनलोड अनुक्रमणिका अमान्य करें + डाउनलोड फिर से अनुक्रमित करें क्लिपबोर्ड पर कॉपी हो गया है %s से भी हटा दें स्वत: @@ -700,4 +700,205 @@ आपकी पुस्तकालय में एक समान नाम वाली प्रविष्टियाँ हैं।\n\nस्थानांतरित करने के लिए एक प्रविष्टि चुनें या फिर भी जोड़ें। %1$s अध्याय डाउनलोड, बैकअप और अन्य चीज़ों को संग्रहित करने के लिए एक फ़ोल्डर चुनें।\n\nएक समर्पित फ़ोल्डर उपयुक्त रहेगा।\n\nचयनित फ़ोल्डर: %2$s एक्सटेंशन स्थापित करने के लिए अनुमतियाँ आवश्यक हैं। अनुमति देने के लिए यहाँ टैप करें। + दान करें + अनुप्रयोग संस्थापित करने की अनुमति + स्रोत विस्तार संस्थापित करने हेतु। + अधिसूचना अनुमति + पुस्तकालय अपडेट और बाकी की सूचनाएँ पाएँ। + पृष्ठभूमि में बैटरी का उपयोग + लंबे समय तक चलने वाले पुस्तकालय अपडेट, डाउनलोड और बैकअप बहाली में रुकावट से बचें। + क्रैश लॉग भेजें + डेवलपर्स को गुमनाम क्रैश लॉग भेजें। + डाटा विश्लेषण की अनुमति दें + ऐप की सुविधाएँ बेहतर करने के लिए गुमनाम उपयोग डेटा भेजें। + अनुमति दें + %s पर नए हैं? हम सुझाव देते हैं कि शुरुआत करने की गाइड देखें। + %s को फिर से इंस्टॉल कर रहे हैं? + पढ़ने का मोड, प्रदर्शन, मार्गदर्शन + एक-तरफ़ा प्रगति सिंक, बेहतर सिंक + कैटपुचिन + एकवर्णी + नॉर्ड + सापेक्ष समय-चिह्न + \"%2$s\" के बजाय \"%1$s\" + मंगा विवरण में चित्र दिखाएँ + सुरक्षा + एनालिटिक्स और क्रैश लॉग्स + क्रैश लॉग्स और एनालिटिक्स भेजने से हम समस्याएँ पहचानकर ठीक कर पाएँगे, प्रदर्शन सुधार पाएँगे, और भविष्य के अपडेट आपकी ज़रूरतों के अनुसार बना पाएँगे + स्मार्ट अपडेट + गुम हुए अध्याय के संकेत छुपाएँ + विश्वसनीय अज्ञात एक्सटेंशन्स रद्द करें + एक्सटेंशन रिपॉजिटरीज + आपने कोई रिपॉ सेट नहीं किया है। + रिपॉ जोड़ें + रिपॉ URL + %s में अतिरिक्त रिपॉज़ जोड़ें। यह एक URL होना चाहिए जो \"index.min.json\" पर समाप्त होता हो। + यह रिपॉ पहले से मौजूद है! + रिपॉ हटाएँ + अमान्य रिपॉ URL + क्या आप रिपॉ \"%s\" हटाना चाहते हैं? + क्या आप रिपॉ \"%s\" जोड़ना चाहते हैं? + ओपन सोर्स रिपॉ + बदलें + साइनिंग की फिंगरप्रिंट पहले से मौजूद है + रिपॉजिटरी %1$s का साइनिंग की फिंगरप्रिंट %2$s के समान है।\nयदि यह अपेक्षित है, तो %2$s को बदला जाएगा, अन्यथा अपने रिपॉ मेंटेनर से संपर्क करें। + घुमाए गए चौड़े पृष्ठों की ओरिएंटेशन उलटें + दुबारा टैप करके ज़ूम करें + पृष्ठ बदलने पर फ्लैश करें + ई-इंक डिस्प्ले पर घोस्टिंग कम करता है + फ्लैश की अवधि + %1$s मिलीसेक + हर बार फ्लैश करें + के साथ फ्लैश करें + काला + सफ़ेद + सफ़ेद और काला + कस्टम हार्डवेयर बिटमैप सीमा + डिफ़ॉल्ट (%d) + यदि रीडर खाली छवि लोड करता है तो सीमा धीरे-धीरे कम करें।\nचयनित: %s + लॉन्ग स्ट्रिप रीडर के लिए पुराना डिकोडर उपयोग करें + प्रदर्शन को प्रभावित करता है। केवल तभी सक्षम करें जब बिटमैप सीमा कम करने से खाली छवि की समस्याएं ठीक न हों + कस्टम डिस्प्ले प्रोफ़ाइल + ज़ूम आउट अक्षम करें + कोई स्टोरेज स्थान सेट नहीं किया गया है + डाउनलोड डायरेक्टरी बनाने में विफल + डायरेक्टरी बनाने में विफल: %s + दोहरे पढ़े गए अध्याय डाउनलोड करना छोड़ें + लंबी छवियों को विभाजित करें + पढ़े गए के रूप में चिह्नित करते समय प्रगति अपडेट करें + ट्रैकर लॉगिन + स्टोरेज स्थान + स्वचालित बैकअप, अध्याय डाउनलोड और स्थानीय स्रोत के लिए उपयोग किया जाता है। + बनाएँ + पूर्ण त्रुटि: + JSON बैकअप समर्थित नहीं है + बैकअप फ़ाइल भ्रष्ट हो गई है + ऐप सेटिंग्स + स्रोत सेटिंग्स + एक्सटेंशन रिपॉजिटरीज + संवेदनशील सेटिंग्स शामिल करें (जैसे, ट्रैकर लॉगिन टोकन) + सभी पढ़ी गई प्रविष्टियाँ + स्टोरेज अनुमति नहीं मिली है + बैकअप फ़ाइल बनाने में असमर्थ + अंतिम स्वचालित बैकअप: %s + स्टोरेज उपयोग + उपलब्ध: %1$s / कुल: %2$s + निर्यात करें + पुस्तकालय सूची + पुस्तकालय निर्यातित हो गया + पुस्तकालय सिंक हो रहा है + अमान्य यूज़र एजेंट स्ट्रिंग + ऐप को डाउनलोड किए गए अध्याय फिर से जांचने के लिए मजबूर करें + आप डेटाबेस से प्रविष्टियाँ हटाने वाले हैं + पढ़े गए अध्याय और गैर-पुस्तकालय प्रविष्टियों की प्रगति खो जाएगी + पढ़े गए अध्याय वाली प्रविष्टियाँ रखें + पुस्तकालय मंगा शीर्षक स्रोत से मेल खाने के लिए अपडेट करें + चेतावनी: यदि किसी मंगा का नाम बदला जाता है, तो वह डाउनलोड कतार से हटा दिया जाएगा (यदि मौजूद हो)। + F-Droid बिल्ड आधिकारिक तौर पर समर्थित नहीं हैं।\nअधिक जानने के लिए टैप करें। + एक्सटेंशन के लिए पढ़ने के इतिहास को रोकें + लॉगिन हो रहा है… + ओवरले + परिणाम हैं + लेखक + कलाकार + अज्ञात शीर्षक + संभावित डुप्लिकेट्स + हर बार अनुमान लगाएं + हर बार अपडेट करने के लिए सेट करें + नए अध्याय लगभग %1$s में रिलीज़ होने की संभावना है, लगभग हर %2$s में जांच की जा रही है। + यह मंगा या तो पूरा हो चुका है, या कोई अनुमानित रिलीज़ तारीख उपलब्ध नहीं है। + जल्द ही + कस्टम अपडेट आवृत्ति: + स्कैनलेटर को बाहर करें + कोई स्कैनलेटर नहीं मिला + ट्रैकर्स को अध्याय %d तक अपडेट करें? + ट्रैकर्स को अध्याय %d तक अपडेट किया गया + निजी तौर पर ट्रैक किया गया + निजी रूप से ट्रैक करें + सार्वजनिक रूप से ट्रैक करें + %1$s त्रुटि: %2$s + तारीख हटाएं? + यह आपके पहले चुने गए प्रारंभ तिथि %s को हटा देगा + यह आपके पहले चुने गए समाप्ति तिथि %s को हटा देगा + %s ट्रैकिंग हटाएं? + यह ट्रैकिंग को स्थानीय रूप से हटा देगा। + अभी अभी + कभी नहीं + आगामी अपडेट देखें + आगामी मार्गदर्शिका + अगला महीना + पिछला महीना + अरे! + %s को एक अप्रत्याशित त्रुटि का सामना करना पड़ा। हम सुझाव देते हैं कि आप क्रैश लॉग्स हमारे Discord सपोर्ट चैनल में साझा करें। + एप्लिकेशन पुनः प्रारंभ करें + समीक्षा + पूर्ण किए गए प्रविष्टियाँ + पढ़ने का समय + प्रविष्टियाँ + वैश्विक अपडेट में + कुल + पढ़ा + ट्रैकर्स + ट्रैक की गई प्रविष्टियाँ + औसत स्कोर + प्रयुक्त + लागू नहीं + %dd + %dh + %dm + %ds + लाइब्रेरी अपडेट हो रही है… (%s) + छोड़ दिया गया क्योंकि सीरीज़ को अपडेट की आवश्यकता नहीं है + छोड़ दिया गया क्योंकि आज कोई रिलीज़ अपेक्षित नहीं थी + स्थायी फ़ोल्डर एक्सेस प्राप्त करने में विफल। ऐप असामान्य रूप से काम कर सकता है। + कोई फ़ाइल चयनित नहीं + श्रेणी खाली है + इस श्रेणी में कोई प्रविष्टियाँ नहीं मिलीं + Cloudflare सहायता के लिए यहां टैप करें + *आवश्यक + डाउनलोड जांच रहे हैं + HTTP %d, वेबसाइट WebView में जांचें + इंटरनेट कनेक्शन नहीं है + %s तक पहुँच नहीं पाया + उस भाग का आनंद लिया जहाँ… + चयनित + उपलब्ध + सभी चुनें + कोई नहीं चुनें + सक्षम स्रोत चुनें + पिन किए गए स्रोत चुनें + जारी रखें + स्थानांतरित करने के लिए डेटा + स्थानांतरण के बाद वर्तमान प्रविष्टि के डाउनलोड हटाएं + अतिरिक्त कीवर्ड (वैकल्पिक) + अतिरिक्त कीवर्ड जोड़कर खोज परिणामों को सीमित करने में मदद करता है + मेल न खाने वाली प्रविष्टियाँ छुपाएं + नए अध्याय नहीं वाले प्रविष्टियाँ छुपाएं + केवल तब प्रविष्टि दिखाएं जब मैच में अतिरिक्त अध्याय हों + ये विकल्प धीमे और जोखिम भरे हैं और स्रोतों से प्रतिबंधों का कारण बन सकते हैं + उन्नत खोज मोड + विस्तृत खोज के लिए शीर्षक को कीवर्ड में विभाजित करता है + अध्याय संख्या के आधार पर मिलान करें + यदि सक्षम है, तो सबसे आगे वाले मिलान को चुनता है। अन्यथा, स्रोत प्राथमिकता के अनुसार पहला मिलान चुनता है। + स्थानांतरण + स्थानांतरण (%1$d/%2$d) + कॉपी + स्थानांतरित + कोई विकल्प नहीं मिला + नवीनतम: %1$s + अज्ञात + मैन्युअल रूप से खोजें + स्थानांतरित न करें + अभी स्थानांतरित करें + अभी कॉपी करें + स्थानांतरण रोकें? + रोकें + रद्द करें + कॉपी + स्थानांतरण + रद्द + रद्द + कोई अध्याय नहीं मिला, इस प्रविष्टि का उपयोग स्थानांतरण के लिए नहीं किया जा सकता + ग़ैर-ASCII फ़ाइल नामों की अनुमति न दें + यह उन स्टोरेज मीडिया के साथ संगतता सुनिश्चित करता है जो यूनिकोड का समर्थन नहीं करते, और सक्षम होने पर स्रोत व मंगा फ़ोल्डरों के गैर-ASCII अक्षरों को उनके छोटे अक्षरों वाले UTF-8 हेक्साडेसिमल रूप में मैन्युअली बदलना आवश्यक होता है, जबकि चैप्टर फ़ाइलों के नाम बदलने की आवश्यकता नहीं होती। diff --git a/i18n/src/commonMain/moko-resources/hr/strings.xml b/i18n/src/commonMain/moko-resources/hr/strings.xml index e152542d6e..78bca1ae6f 100644 --- a/i18n/src/commonMain/moko-resources/hr/strings.xml +++ b/i18n/src/commonMain/moko-resources/hr/strings.xml @@ -33,8 +33,8 @@ Isključeno Automatska aktualiziranja Globalno aktualiziranje - Polegnuto - Uspravno + Polegnuti format + Uspravni format Broj stavki po retku Prikaz Sakrij sadržaj obavijesti @@ -168,8 +168,8 @@ Plava Zelena Crvena - Prisili polegnuto - Prisili uspravno + Zaključan polegnuti format + Zaključan uspravni format Slobodno Standardno okretanje Brzo @@ -188,8 +188,8 @@ Prilagodi ekranu Vrsta skaliranja Stranice - Duga traka s razmacima - Duga traka + Kontinuirano listanje s razmacima + Kontinuirano listanje Stranica (okomito) Stranica (s desna na lijevo) Stranica (s lijeva na desno) @@ -302,7 +302,7 @@ Nepoznato Nastavljajući Vodič za lokalni izvor - Pretraži + Pregledaj Najnoviji Globalna pretraga … Označeni @@ -468,8 +468,8 @@ Dodirni za prikaz detalja Ove se Android verzija više ne podržava Kopiranje nije uspješno - Polegnuto - Uspravno + Polegnuti format + Uspravni format Sive nijanse Deaktiviraj anonimni modus Okretanje @@ -512,7 +512,7 @@ Izgled Vodič za pokretanje Ovjeri za potvrditi promjenu - Zadano + Standardno Spremanje sigurnosne kopije i obnavljanje možda neće ispravno raditi, ako MIUI optimizacija nije aktivirana. Pomogni prevoditi Ukupan broj unosa @@ -525,7 +525,7 @@ Instaliranje proširenja … Podaci aplikacije Samo putem Wi-Fi veze - Upozorenje: velika skupna preuzimanja mogu dovesti do usporavanja izvora i/ili blokiranja Mihonja. Za daljnje informacije dodirni. + Upozorenje: velika skupna preuzimanja mogu dovesti do usporavanja izvora i/ili blokiranja %s. Za daljnje informacije dodirni. Plavozelena i tirkiz Broj unosa u bazi odataka koje nisu u zbirci: %1$d Opširno zapisivanje @@ -535,7 +535,7 @@ Velika aktualiziranja štete izvorima i mogu usporiti aktualiziranja i povećati potrošnju baterije. Dodirni i saznaj više. Niska Aktivnost u pozadini - Osjetljivost za skrivanje izbornika pri pomicanju + Osjetljivost za skrivanje izbornika pri listanju Izbriši predmemoriju poglavlja tijekom pokretanja aplikacije Aktualiziranja aplikacije Nema se što raščistiti @@ -566,7 +566,7 @@ Preskočeno, jer postoje nepročitana poglavlja Nauspjela aktualiziranja: %1$d Dodirni za daljnje informacije - Preokrenuto uspravno + Preokreni uspravni format Premjesti seriju na vrh Deaktivirano Nema unosa u biblioteci za spremanje u sigurnosnu kopiju @@ -619,7 +619,7 @@ Obnovi standardni izraz korisničkog agenta Nevažeći niz korisničkog agenta Prisili aplikaciju da ponovno provjeri preuzeta poglavlja - Zadani niz korisničkog agenta + Standardni niz korisničkog agenta Niz korisničkog agenta ne može biti prazan Ponovo indeksiraj preuzimanja Obnovi postavke čitača serija @@ -776,12 +776,12 @@ Dodaj repozitorij Izbriši repozitorij URL repozitorija - Dodaj dodatne repozitorije u Mihon. To bi trebao biti URL koji završava s „index.min.json”. + Dodaj dodatne repozitorije u %s. To bi trebao biti URL koji završava s „index.min.json”. Neispravan URL repozitorija Opozovi pouzdana nepoznata proširenja Želiš li izbrisati repozitorij „%s”? Otvori repozitorij izvora - Omogući osjetljive postavke (kao što su tokeni za prijavu za usluge praćenja) + Uključi osjetljive postavke (kao što su tokeni za prijavu za usluge praćenja) Predviđa se da će nova poglavlja biti izdana za oko %1$s, provjera se svakih %2$s. Uskoro Dostupno: %1$s / Ukupno: %2$s @@ -847,7 +847,7 @@ Nakon čitanja poglavlja Nakon dohvaćanja novog poglavlja Sakrij indikatore nedostajućih poglavlja - Koristi zastarjeli dekoder za čitač bezprekidnog prikaza mange + Koristi zastarjeli dekoder za čitač kontinuiranog listanja Uklonit ćeš unose iz baze podataka Izgubit će se pročitana poglavlja i napredak unosa koji se ne nalaze u biblioteci Zadrži unose s pročitanim poglavljima @@ -901,4 +901,8 @@ Najnovije: %1$s Nepoznato Nije pronađeno nijedno poglavlje. Ovaj se unos ne može koristiti za premještanje + Doniraj + Iscrtaj slike u opisima manga + Zabrani imena datoteka koji nisu u ASCII formatu + Osigurava kompatibilnost s određenim medijima za spremanje podataka koji ne podržavaju Unicode. Kada je ova opcija aktivirana, morat ćeš ručno preimenovati izvor i mape s mangama zamjenjivanjem znakova koji nisu ASCII s njihovim UTF-8 heksadecimalnim vrijednostima (u malim slovima). Datoteke poglavlja se ne moraju preimenovati. diff --git a/i18n/src/commonMain/moko-resources/in/strings.xml b/i18n/src/commonMain/moko-resources/in/strings.xml index c8597a9db8..94e213ec34 100644 --- a/i18n/src/commonMain/moko-resources/in/strings.xml +++ b/i18n/src/commonMain/moko-resources/in/strings.xml @@ -34,7 +34,7 @@ Tambah kategori Ubah kategori Ubah nama kategori - "Tentukan kategori" + Tentukan kategori Ubah gambar sampul Hentikan sementara Bab sebelumnya @@ -533,7 +533,7 @@ Pemasang Total entri Pembaruan berskala besar membahayakan sumber, dapat membuat pembaruan lambat dan meningkatkan penggunaan baterai. Ketuk untuk mempelajari lebih lanjut. - Peringatan: mengunduh dalam jumlah besar bisa menyebabkan sumber menjadi lambat dan/atau memblokir Mihon. Ketuk untuk mempelajari lebih lanjut. + Peringatan: mengunduh dalam jumlah besar bisa menyebabkan sumber menjadi lambat dan/atau memblokir %s. Ketuk untuk mempelajari lebih lanjut. Peringatan Cetak catatan berlebih ke catatan sistem (mengurangi kinerja aplikasi) Anda juga harus menyimpan salinan cadangan di tempat lain. Cadangan mungkin berisi data sensitif termasuk kata sandi yang tersimpan; berhati-hatilah jika berbagi. @@ -767,7 +767,7 @@ Pembauan pintar Memperbarui dari versi lama dan tak yakin harus pilih mana? lihat panduan penyimpanan untuk informasi lebih lanjut. Tambahkan repo - Tambahkan repo lain ke Mihon. Seharusnya URL yang memiliki akhiran \"index.min.json\". + Tambahkan repo lain ke %s. Seharusnya URL yang memiliki akhiran \"index.min.json\". Repositori ekstensi Anda tidak memiliki repositori yang ditetapkan. Kesalahan penuh: @@ -853,4 +853,56 @@ Setelah mengambil bab baru Sembunyikan indikator bab yang hilang Gagal membuat direktori unduhan + Donasi + Render gambar dalam deskripsi manga + Gagal membuat direktori: %s + Anda akan menghapus entri dari database + Membaca bab dan kemajuan entri non-perpustakaan akan hilang + Simpan entri dengan bab yang sudah dibaca + Perbarui judul manga perpustakaan agar sesuai dengan sumbernya + Peringatan: Jika sebuah manga diganti namanya, maka manga tersebut akan dihapus dari antrean unduhan (jika ada). + Sedang masuk… + Duplikat yang mungkin + Anda memiliki entri di perpustakaan Anda dengan nama yang serupa.\n\nPilih entri yang ingin Anda pindahkan atau tambahkan tetap. + Suka bagian di mana… + Dipilih + Tersedia + Pilih semua + Tidak memilh + Pilih sumber yang diaktifkan + Pilih sumber yang disematkan + Lanjutkan + Data yang akan dipindahkan + Hapus unduhan entri saat ini setelah migrasi + Kata kunci tambahan (opsional) + Membantu mempersempit hasil pencarian dengan menambahkan kata kunci tambahan + Sembunyikan entri yang tidak cocok + Sembunyikan entri yang tidak memiliki bab baru + Hanya tampilkan entri jika pertandingan memiliki bab tambahan + Opsi-opsi ini lambat dan berbahaya, dan dapat menyebabkan pembatasan dari sumber-sumber + Mode pencarian lanjutan + Memecah judul menjadi kata kunci untuk pencarian yang lebih luas + Cocokkan berdasarkan nomor bab + Jika diaktifkan, memilih pertandingan yang paling jauh di depan. Jika tidak, memilih pertandingan pertama berdasarkan prioritas sumber. + Migrasi + Migrasi (%1$d/%2$d) + Salin + Migrasi + Alternatif tidak ditemukan + Terbaru: %1$s + Tidak Diketahui + Cari secara manual + Jangan migrasi + Migrasi sekarang + Salin sekarang + Berhenti bermigrasi? + Berhenti + Batal + Salin + Migrasi + Batal + Batal + Tidak ditemukan bab, entri ini tidak dapat digunakan untuk migrasi + Jangan izinkan nama file non-ASCII + Memastikan kompatibilitas dengan beberapa media penyimpanan yang tidak mendukung Unicode. Jika opsi ini diaktifkan, Anda harus mengganti nama folder sumber dan manga secara manual dengan mengganti karakter non-ASCII menjadi representasi heksadesimal UTF-8 huruf kecil. File chapter tidak perlu diganti namanya. diff --git a/i18n/src/commonMain/moko-resources/ja/strings.xml b/i18n/src/commonMain/moko-resources/ja/strings.xml index 60cadaab8c..6769c89ffd 100644 --- a/i18n/src/commonMain/moko-resources/ja/strings.xml +++ b/i18n/src/commonMain/moko-resources/ja/strings.xml @@ -121,10 +121,10 @@ 既定の画面向き 自動回転 縦向き画面を強制 - R - G - B - A + + + + アルファ 手動で既読にした後 読んだ後自動で削除 無効 @@ -342,7 +342,7 @@ 更新あり ライブラリを更新時、新しい表紙と情報を確認します メタデータを自動で更新 - グリッドの項目数 + 行あたりのアイテム数 画面 通知内容を非表示 セキュア画面はアプリを切り替える時アプリの内容を非表示し、画面キャプチャを無効化します @@ -687,8 +687,8 @@ 画面に合わせるように幅広いページを回転 回転した幅広いページの向きを反転 デバッグ情報 - 左へスワイプ時の操作 - 右へスワイプ時の操作 + 左にスワイプする章 + 右にスワイプする章 ダブルタップでズーム 間隔を設定 カスタマイズした更新頻度 @@ -777,7 +777,7 @@ 不明な拡張機能の信頼を取り消す 拡張機能リポジトリ リポジトリURLが無効です - Mihonにリポジトリを追加します。「index.min.json」で終わるURLを入力してください。 + %sにリポジトリを追加します。「index.min.json」で終わるURLを入力してください。 リポジトリを追加 ソース リポジトリを開く 古いバージョンからバージョンアップしたばかりで、選択に悩んでいますか?ストレージ ガイドにご参照ください。 @@ -835,12 +835,12 @@ ノート ノートを編集 バックアップ - 動作設定 + 行動 章の読了後 ライブラリーのマンガのタイトルをソースに合わせて更新 拡張機能の既読章履歴を一時停止 ログイン中… - 重複した既読済みの章を既読扱い + 重複する既読章を既読としてマークする 新章取得後 ライブラリに名前が似ている作品があります。\n\n移行作品の選択、またはそのまま追加。 著者 @@ -850,6 +850,14 @@ ディレクトリの作成に失敗しました: %s データベースから作品が削除されます ライブラリ外作品の既読の章と進捗は失われます - 既読の章がある作品は保持 + 読み終えた章を含むエントリーを保持する 重複の可能性あり + 寄付する + 自動車 + キャットプッチン + モノクロ + マンガの描写で画像をレンダリングする + 欠落している章のインジケーターを非表示にする + レガシーデコーダーを長尺ストリップリーダーに使用する + ライブラリーリスト diff --git a/i18n/src/commonMain/moko-resources/jv/plurals.xml b/i18n/src/commonMain/moko-resources/jv/plurals.xml index 36b8ae5290..0e45ee1717 100644 --- a/i18n/src/commonMain/moko-resources/jv/plurals.xml +++ b/i18n/src/commonMain/moko-resources/jv/plurals.xml @@ -10,15 +10,60 @@ %d kategori - %1$d dino engkas + %1$d Dino engkas - Lanjut %d chapter sing gorong diwoco + Nggawe %d chapter sing gorong diwoco - Mari kurang %1$s karo %2$s error + Mari kurang %1$s karo %2$s kaluputan Kurang %1$s + + %d dina + + + %1$s latar + + + %1$s bab Ilang + + + %1$s bab + + + Puniki %d chapter + + + %d pelacak + + + Nglangkungi %d bab, embuh sumbere ilang utawa wis difilter + + + kanggo entri %d + + + %1$d bab anyar + + + Bab %1$s lan %2$d liyane + + + Wonten %d Nganyari ekstensi + + + %d repo + + + Pindhah %1$d entri? + + + Salin %1$d entri? + + + %1$d entri lewatin + diff --git a/i18n/src/commonMain/moko-resources/jv/strings.xml b/i18n/src/commonMain/moko-resources/jv/strings.xml index f636d27f6d..173a52b1da 100644 --- a/i18n/src/commonMain/moko-resources/jv/strings.xml +++ b/i18n/src/commonMain/moko-resources/jv/strings.xml @@ -13,10 +13,10 @@ Versi DNS liwat HTTPS Dipateni - T - B - I - A + Alfa + Biru + Ijo + Abang Cepet Nengen Ngiwa @@ -99,7 +99,7 @@ Donlotan mandheg Donloder Komplit - durung maca apa apa + Durung maca Opo-opo Jeda Nyunting sampul Ngatur kategori @@ -244,11 +244,7 @@ Nganyari metadata otomatis Jaringan gak kebates tok Bohoso aplikasi - Ekstensi iki ditandatangani nganggo sertifikat sing ora dipercaya lan ora diaktifake. -\n -\n Ekstensi angkoro bisa maca kredensial login sing disimpen ing Mihon utawa nglakokake kode sewenang-wenang. -\n -\n Kanthi percaya karo sertifikat iki, sampeyan nampa risiko kasebut. + Ekstensi iki ditandatangani nganggo sertifikat sing ora dipercaya lan ora diaktifake.\n\nEkstensi angkoro bisa maca kredensial login sing disimpen ing Mihon utawa nglakokake kode sewenang-wenang. Kanthi percaya karo sertifikat iki, sampeyan nampa risiko kasebut. Ndownload Tampilake overlay zona tutul Manga ing kategori sing ora kalebu ora bakal dianyari sanajan uga ana ing kategori sing kalebu. @@ -271,7 +267,7 @@ Ketok pinggiran Ganti panggonan pamisah kaca kaping pindho Yen panggonan pamisah kaca dobel ora cocog karo arah maca - Mati + Seda Padhang khusus Animasi transisi kaca Kacepetan animasi tutul kaping pindho @@ -285,7 +281,7 @@ Ngobong / peteng Nangkis / Padang Skip bab sing disaring - Grayscale + Skala abu-abu Vertikal Otomatis Mode maca standar @@ -305,9 +301,16 @@ Diundhuh Telusuri… Ngehapus downloadan - Dipilih - Gak dipilih + Dipunpilih + Mboten dipunpilih Pilihan liane Data lan penyimpanan Bakal muncul + navigasi mendhuwur + Diluru + Sumbangan + Otomatis + Bikak kunci %s + Trapake jeda wayah + Nganyari panyaris frekuensi diff --git a/i18n/src/commonMain/moko-resources/ko/plurals.xml b/i18n/src/commonMain/moko-resources/ko/plurals.xml index 3b07ce43c6..0d1c7d0bef 100644 --- a/i18n/src/commonMain/moko-resources/ko/plurals.xml +++ b/i18n/src/commonMain/moko-resources/ko/plurals.xml @@ -51,4 +51,19 @@ %d 저장소 + + %1$d일 후 + + + %1$s 페이지 + + + %1$d개 항목을 이동하시겠습니까? + + + %1$d개 항목을 복사하시겠습니까? + + + %1$d개 항목이 생략되었습니다 + diff --git a/i18n/src/commonMain/moko-resources/ko/strings.xml b/i18n/src/commonMain/moko-resources/ko/strings.xml index c31a6ddd55..f57530425c 100644 --- a/i18n/src/commonMain/moko-resources/ko/strings.xml +++ b/i18n/src/commonMain/moko-resources/ko/strings.xml @@ -64,7 +64,7 @@ 동기화 고급 정보 - 격자 크기 + 행당 항목 수 데이터 이전 확장 앱 확장 앱 정보 @@ -234,10 +234,10 @@ 배율 설정 화면 맞춤 자동 맞춤 - R - G - B - A + 적색 + 녹색 + 청색 + 알파 끝에서 두번째 회차 끝에서 세번째 회차 끝에서 네번째 회차 @@ -313,7 +313,7 @@ 네트워크 복원 취소 백업 실패 - %02d분 %02d초 + %1$02d분 %2$02d초 잘못된 백업 파일: 자동 다운로드 북마크 표시된 회차 삭제 허용 @@ -462,7 +462,7 @@ 내역 삭제 기록이 삭제되었습니다 저장 공간이 부족하여 회차를 다운로드 할 수 없습니다 - 경고: 대량 다운로드는 소스가 느려지거나 Mihon를 차단할 수 있습니다. 탭하여 자세히 알아보기. + 경고: 대량 다운로드는 원본 속도에 영향을 미치거나 %s을 차단할 수 있습니다. 탭하여 자세히 알아보기. 대규모 업데이트는 소스에 피해를 입히고 업데이트가 느려지고 배터리 사용량이 증가할 수 있습니다. 탭하여 자세히 알아보기. %1$s화 %1$d개의 업데이트가 실패했습니다 @@ -555,7 +555,7 @@ 새로고침 청사과 문어 - Yin & Yang + 음양 요츠바 성인 콘텐츠 소스 소스 및 확장 기능 목록에 보이기 @@ -647,7 +647,7 @@ \n자세히 알아보려면 탭하세요. 계속 읽기 버튼 %s에서 이전에 선택한 완료 날짜가 제거됩니다 - 다운로드 인덱스 제거 + 다운로드 인덱스 다시 설정 날짜를 제거 하시겠습니까? %s에서 이전에 선택한 시작 날짜가 제거됩니다 앱이 다운로드한 회차를 다시 확인하도록 강제 @@ -687,8 +687,8 @@ 화면에 맞게 넓은 페이지 회전 회전된 넓은 페이지의 회전 방향 디버그 정보 - 왼쪽으로 스와이프 액션 - 오른쪽으로 스와이프 액션 + 왼쪽으로 스와이프하는 챕터 + 오른쪽으로 스와이프하는 챕터 두 번 탭하여 줌 간격 설정 사용자 설정 업데이트 빈도 @@ -750,7 +750,7 @@ 신뢰한 알수없는 확장 앱 신뢰 취소 자동 백업, 챕터 다운로드 및 로컬 소스에 사용됩니다. 사용자 지정 업데이트 빈도: - Mihon에 추가적으로 저장소를 추가합니다. \"index.min.json\"으로 끝나는 URL이어야 합니다. + %s에 추가적으로 저장소를 추가합니다. \"index.min.json\"으로 끝나는 URL이어야 합니다. 소스 저장소 열기 곧 출시 먼저 몇 가지 사항을 설정해 보겠습니다. 나중에 언제든지 설정에서 변경할 수도 있습니다. @@ -785,4 +785,87 @@ 없음 사용가능: %1$s / 전체: %2$s Nord + 곧 공개 + 기부 + 자동 + 무작위 + 링크 복사 + 읽지 않은 챕터 + 노트 + 노트 편집 + 추가 + 크래시 로그 전송 + 개발자에게 익명화된 로그를 전송합니다. + 분석 허가 + 익명화된 사용 데이터를 전송하여 앱 기능 개선에 기여합니다. + 캣푸친(Catppuccin) + 모노크롬 + 만화 설명에 이미지를 렌더링합니다 + 보안 + 분석 및 크래시 로그 + 크래시 로그와 분석 데이터를 전송하면, 문제를 식별 및 해결하며, 성능을 개선하고, 향후 업데이트를 사용자 요구사항에 더 적합하게 만들 수 있습니다 + 행동 + 중복된 읽은 챕터를 읽은 것으로 표시 + 챕터를 읽은 후 + 새 챕터를 가져온 후 + 누락된 챕터 표시 숨기기 + 제거 + 확장 앱을 제거하시겠습니까? + 정말로 \"%s\" 확장 앱을 제거하시겠습니까? + \"%s\" 리포지토리를 추가하시겠습니까? + 교체 + 서명 키 지문이 이미 존재합니다 + %1$s 리포지토리는 %2$s와 같은 서명 키 지문을 가지고 있습니다.\n예상된 경우라면 %2$s가 대체되며, 그렇지 않을 경우 리포지토리 관리자에게 연락하십시오. + 플래시 지속시간 + %1$s ms + 플래시 간격 + 커스텀 하드웨어 비트맵 임계값 + 기본값 (%d) + 리더가 빈 이미지를 불러올 경우 임계값을 점진적으로 줄입니다.\n선택: %s + 긴 스트립 리더에 레거시 디코더 사용 + 성능에 영향을 미칩니다. 비트맵 임계값을 줄여도 빈 이미지 문제가 해결되지 않을 경우에만 활성화하십시오 + 커스텀 디스플레이 프로필 + 줌아웃 비활성화 + 다운로드 경로 생성 실패 + 경로 생성 실패: %s + 중복된 읽은 장 다운로드 스킵 + 읽음으로 표시될 때 진행상황 업데이트 + JSON 백업은 지원되지 않습니다 + 백업 파일 파손 + 확장 앱 리포지토리 + 모든 읽은 항목 + 내보내기 + 라이브러리 목록 + 라이브러리 내보냄 + 데이터베이스에서 항목을 삭제하려 합니다 + 읽은 챕터와 라이브러리 항목에 없는 진행상황이 삭제됩니다 + 읽은 챕터가 있는 항목 유지 + 라이브러리 만화 타이틀을 원본과 일치하도록 업데이트 + 경고: 만화의 이름이 변경될 경우 다운로드 대기열에서 (존재할 경우) 제거됩니다. + 확장 앱 읽기 기록 중지 + 로그 기록 중… + 저자 + 아티스트 + 중복 가능 + 라이브러리에 유사한 이름의 항목이 있습니다.\n\n이동하거나 추가할 항목을 선택하십시오. + 이 만화는 완결되었거나 예상 출시일이 없습니다. + 트래커를 %d 챕터에 업데이트하시겠습니까? + 트래커가 %d 챕터에 업데이트 + 업데이트 예정 표시 + 예정일 안내 + 다음 달 + 이전 달 + 지속적인 폴더 액세스에 실패했습니다. 앱이 예상치 못하게 동작할 수 있습니다. + 플래시 대상 + 흑색 + 백색 + 백색 및 흑색 + 비공개 트래킹됨 + 비공개 트래킹 + 공개 트래킹 + 선택됨 + 모두 선택 + 선택 해제 + ASCII가 아닌 파일명 비허용 + 유니코드를 지원하지 않는 특정 저장 매체와의 호환성을 보장합니다. 이 기능을 활성화하면 원본 폴더와 만화 폴더의 이름을 수동으로 변경해야 합니다. ASCII가 아닌 문자를 해당하는 소문자 UTF-8 16진수 표현으로 대체하여 이름을 변경하십시오. 챕터 파일은 이름을 변경할 필요가 없습니다. diff --git a/i18n/src/commonMain/moko-resources/ms/plurals.xml b/i18n/src/commonMain/moko-resources/ms/plurals.xml index 53ad0429b1..5a28a29ed2 100644 --- a/i18n/src/commonMain/moko-resources/ms/plurals.xml +++ b/i18n/src/commonMain/moko-resources/ms/plurals.xml @@ -51,4 +51,19 @@ %d repositori + + Dalam %1$d hari + + + %1$s halaman + + + Berhijrah %1$d Kemasukan? + + + Salin %1$d penyertaan? + + + %1$d Penyertaan telah dilangkau + diff --git a/i18n/src/commonMain/moko-resources/ms/strings.xml b/i18n/src/commonMain/moko-resources/ms/strings.xml index 1e5055b488..3c1578de12 100644 --- a/i18n/src/commonMain/moko-resources/ms/strings.xml +++ b/i18n/src/commonMain/moko-resources/ms/strings.xml @@ -66,7 +66,7 @@ Penjejakan Lanjutan Tentang - Saiz grid + Item setiap baris Potret Landskap Kemas kini automatik @@ -117,10 +117,10 @@ Bebas Kekal potret Kekal landskap - R - G - B - A + Merah + Hijau + Biru + Alpha Selepas secara manual ditandakan sebagai dibaca Selepas membaca padam secara automatik Dinyahkan @@ -357,7 +357,7 @@ Terakhir digunakan Semak untuk kemas kini Panduan penggunaan sumber lokal - %02d minit, %02d saat + %1$02d minit, %2$02d saat Tapis semua entri di dalam pustaka anda Kelabu Mod membaca @@ -501,7 +501,7 @@ Yotsuba Yin & Yang Tako - Midnight Dusk + Tengah malam senja Epal Hijau Dinamik Tema aplikasi @@ -542,7 +542,7 @@ Kemas kini yang besar membahayakan sumber dan mengakibatkan sumber menjadi perlahan dan juga peningkatan penggunaan bateri. Ketik untuk ketahui selebihnya. Hanya menggunakan Wi-Fi Setiap 3 hari - Amaran: muat turun secara pukal besar boleh menyebabkan sumber menjadi lebih perlahan dan/atau menyekat Mihon. Ketik untuk ketahui selebihnya. + Amaran: muat turun secara pukal besar boleh menyebabkan sumber menjadi lebih perlahan dan/atau menyekat Mihon %s. Ketik untuk ketahui selebihnya. Kemas kini semua Kemas kini aplikasi Hapus cache bab apabila membuka aplikasi @@ -687,9 +687,9 @@ Terbalikkan orientasi muka surat lebar yang diputarkan Putar muka surat lebar agar muat Maklumat nyahpepijat - Tindakan leret ke kanan + Bab mengenai leret ke kanan Ketik dua kali untuk zum - Tindakan leret ke kiri + Bab mengenai leret ke kiri Tetapkan jarak masa Kekerapan kemaskini tersuai Kemas kini seterusnya dijangka @@ -770,10 +770,10 @@ Skor penjejak Batalkan sambungan dipercayakan yang tidak diketahui Anda tidak menetapkan repositori. - Tambah repositori tambahan pada Mihon. Ini mestilah URL yang berakhir dengan \"index.min.json\". + Tambah repositori tambahan pada Mihon %s. Ini mestilah URL yang berakhir dengan \"index.min.json\". Buka sumber repositori Tidak lama lagi - Scanlator + Pemindai Kecualikan scanlators Navigasi ke atas Digunakan untuk sandaran automatik, muat turun bab, dan sumber lokal. @@ -786,4 +786,122 @@ Sandaran automatik terakhir:%s Mengemaskini pustaka… (%s) Ganti + Akan datang + Lumpuhkan zum keluar + Lihat kemas kini yang akan datang + Panduan yang akan datang + Bulan depan + Bulan sebelumnya + Menderma + Otomatis + Rawak + Pautan salin + Bab yang belum dibaca + Nota + Ubah Catatan + Hantar log kemalangan + Hantar log kemalangan tanpa nama kepada pemaju. + Benarkan analisis + Hantar data penggunaan tanpa nama untuk meningkatkan ciri aplikasi. + Catppuccin + Tambah sahaja + Paparan profil tersuai + Monokrom + Memaparkan imej dalam huraian manga + cagaran + Analitis dan Log Ranap + Menghantar log ranap dan analitis akan membolehkan kami mengenal pasti dan membetulkan isu, meningkatkan prestasi dan menjadikan kemas kini masa hadapan lebih berkaitan dengan keperluan anda + kelakuan + Tandakan pendua bab dibaca sebagai dibaca + Selepas membaca satu bab + Selepas mengambil bab baru + Sembunyikan penunjuk bab yang hilang + Alih keluar + Alih keluar Sambungan? + Adakah anda benar -benar mahu mengeluarkan \"%s\" Lanjutan? + Adakah anda ingin menambah repo \"%s\"? + Menandatangani cap jari utama sudah ada + Repositori %1$s mempunyai cap jari utama yang menandatangani sama seperti %2$s.\nSekiranya ini dijangka, %2$s akan diganti, jika tidak hubungi penyelenggara repo anda. + Tempoh kilat + %1$s ms + Flash setiap + Kilat dengan + Hitam + Putih + Putih dan Hitam + Ambang bitmap perkakasan tersuai + Lalai (%d) + Sekiranya pembaca memuatkan imej kosong secara bertahap mengurangkan ambang.\nDipilih: %s + Gunakan penyahkod warisan untuk pembaca jalur panjang + Mempengaruhi prestasi. Hanya membolehkan jika mengurangkan ambang bitmap tidak membetulkan masalah imej kosong + Gagal membuat direktori muat turun + Gagal membuat direktori: %s + Langkau memuat turun Bab Baca Duplikat + Kemas kini kemajuan apabila ditandakan seperti yang dibaca + Sandaran json tidak disokong + Fail sandaran rosak + Repos lanjutan + Semua penyertaan membaca + Eksport + Senarai Perpustakaan + Perpustakaan dieksport + Anda akan mengeluarkan penyertaan dari pangkalan data + Baca bab dan kemajuan penyertaan bukan perpustakaan akan hilang + Simpan penyertaan dengan Bab Baca + Kemas kini tajuk manga perpustakaan untuk memadankan sumber + Amaran: Jika manga dinamakan semula, ia akan dikeluarkan dari barisan muat turun (jika ada). + Jeda membaca sejarah untuk lanjutan + Log masuk… + Pengarang + Artis + Kemungkinan pendua + Anda mempunyai entri di perpustakaan anda dengan nama yang serupa.\n\nPilih entri untuk berhijrah atau tambahkan pula. + Manga ini sama ada selesai, atau tidak ada tarikh pelepasan yang diramalkan. + Kemas kini pelacak ke bab %d? + Penjejak dikemas kini ke bab %d + Dijejaki secara peribadi + Menjejaki secara peribadi + Menjejaki secara terbuka + Gagal memperoleh akses folder yang berterusan. Aplikasi ini mungkin berkelakuan tidak disangka -sangka. + Menikmati bahagian di mana… + Dipilih + Terdapat + Pilih Semua + Pilih Tiada + Pilih sumber yang diaktifkan + Pilih sumber yang disematkan + Teruskan + Data untuk berhijrah + Padamkan muat turun entri semasa selepas penghijrahan + Kata kunci tambahan (pilihan) + Membantu menyempitkan hasil carian dengan menambahkan kata kunci tambahan + Sembunyikan penyertaan tanpa perlawanan + Sembunyikan penyertaan tanpa bab yang lebih baru + Hanya tunjukkan entri jika perlawanan mempunyai bab tambahan + Pilihan ini lambat dan berbahaya dan boleh menyebabkan sekatan dari sumber + Mod carian lanjutan + Memecah tajuk ke dalam kata kunci untuk carian yang lebih luas + Perlawanan berdasarkan nombor bab + Jika diaktifkan, pilih perlawanan yang paling jauh ke depan. Jika tidak, pilih perlawanan pertama dengan keutamaan sumber. + Penghijrahan + Penghijrahan (%1$d/%2$d) + Salin + Berhijrah + Tiada alternatif yang dijumpai + Terkini: %1$s + Tidak diketahui + Cari secara manual + Jangan berhijrah + Berhijrah sekarang + Salin sekarang + Berhenti berhijrah? + Berhenti + Batalkan + Salin + Berhijrah + Batalkan + Batal + Tidak ada bab yang dijumpai, entri ini tidak dapat digunakan untuk penghijrahan + Tidak benarkan nama fail bukan ASCII + Memastikan keserasian dengan media penyimpanan tertentu yang tidak menyokong Unicode. Apabila ini diaktifkan, anda perlu menamakan semula folder sumber dan manga secara manual dengan menggantikan aksara bukan-ASCII dengan representasi heksadesimal UTF-8 huruf kecil mereka. Fail bab tidak perlu dinamakan semula. diff --git a/i18n/src/commonMain/moko-resources/ne/strings.xml b/i18n/src/commonMain/moko-resources/ne/strings.xml index 23cb137fa0..0c83424a44 100644 --- a/i18n/src/commonMain/moko-resources/ne/strings.xml +++ b/i18n/src/commonMain/moko-resources/ne/strings.xml @@ -865,4 +865,16 @@ तपाईंको पुस्तकालयमा उस्तै नामका इन्ट्रीहरू छन्।\n\nस्थानान्तरण गर्न वा जे भए पनि थप्नको लागि इन्ट्री चयन गर्नुहोस्। तपाईं डाटाबेसबाट इन्ट्रीहरू हटाउन लाग्दै हुनुहुन्छ डाउनलोड directory सिर्जना गर्न असफल भयो + दान + कात्पुचिन + mangaको विवरणहरूमा तस्वीर देखाउनुहोस + नभएको अध्यायहरु लुकौनुहोस + टिपेको + उपलब्ध + सबै तिप्नुहोस + कुनै पनि नतिप्नुहोस + सक्षम स्रोतहरू तिप्नुहोस + पिन गरिएको स्रोतहरू तिप्नुहोस + जारी + माइग्रेट गर्नुपर्ने डाटा diff --git a/i18n/src/commonMain/moko-resources/nl/strings.xml b/i18n/src/commonMain/moko-resources/nl/strings.xml index 73dd1d78f8..05639387a0 100644 --- a/i18n/src/commonMain/moko-resources/nl/strings.xml +++ b/i18n/src/commonMain/moko-resources/nl/strings.xml @@ -85,7 +85,7 @@ Links naar rechts Rechts naar links Verticaal - Webtoon + Lange strip Uitrekken Breedtevullend Hoogtevullend @@ -97,10 +97,10 @@ Midden Standaardoriëntatie Vrij - R - G - B - A + Rood + Groen + Blauw + Alfa Laatst gelezen hoofdstuk Een-na-laatste gelezen hoofdstuk Twee-na-laatste gelezen hoofdstuk @@ -350,7 +350,7 @@ %1$02d min, %2$02d sec Lezen Hoofdstukovergangen altijd weergeven - Doorlopend verticaal + Lange strip met gaten Gefilterde hoofdstukken overslaan Inhoud in uitgesneden gebied laten zien Meldingsinhoud verbergen @@ -540,7 +540,7 @@ Totaal aantal items Houd uitgebreide logs bij in de systeemlogs (verslechterd de werking van de app) App updates - Waarschuwing: grote bulk downloads kunnen leiden tot bronnen die trager werken en/of Mihon blokkeren. Tik om meer te leren. + Waarschuwing: grote bulk downloads kunnen leiden tot bronnen die trager werken en/of %s blokkeren. Tik om meer te leren. Alles updaten Iedere 3 dagen Voor hulp bij het oplossen van fouten bij het bijwerken van de bibliotheek, zie %1$s @@ -772,7 +772,7 @@ Er zijn rechten nodig om extensies te installeren. Tik hier om deze toe te staan. Repo toevoegen Repo URL - Voeg aanvullende repo\'s toe aan Mihon. Dit moet een URL zijn die eindigt op “index.min.json”. + Voeg aanvullende repo\'s toe aan %s. Dit moet een URL zijn die eindigt op “index.min.json”. Ongeldige repo URL Geen opslaglocatie ingesteld Toch toevoegen @@ -819,4 +819,72 @@ Duplicaat gelezen hoofdstuk als gelezen markeren Ongelezen hoofdstukken Monochroom + Doneer + Geef afbeeldingen weer in mangabeschrijvingen + Verberg ontbrekende hoofdstukindicatoren + Verbied niet-ASCII-bestandsnamen + Verzekert compatibiliteit met bepaalde opslagmedia die Unicode niet ondersteunen. Wanneer dit is ingeschakeld moet je manueel bron- en mangamappen hernoemen door niet-ASCII-tekens te vervangen met hun UTF-8 hexadecimale representaties in kleine letters. Hoofdstukbestanden moeten niet hernoemd worden. + Aangepaste hardware bitmapdrempel + Standaard (%d) + Als de lezer een lege afbeelding laadt, verlaag incrementeel de drempelwaarde.\nGeselecteerd: %s + Gebruik verouderde decoder voor lange striplezer + Beïnvloedt prestaties. Schakel dit alleen in als het verlagen van de bitmapdrempel problemen met lege afbeeldingen niet oplost + Downloadmap kon niet worden aangemaakt + Map kon niet worden aangemaakt: %s + Voeg gevoelige intellingen toe (bijv. logintokens voor trackers) + Exporteren + Bibliotheeklijst + Bibliotheek geëxporteerd + Je staat op het punt om items uit de database te verwijderen + Gelezen hoofdstukken en voortgang van niet-bibliotheekitems zullen verloren gaan + Houd items met gelezen hoofdstukken + Update mangatitels in bibliotheek om overeen te komen met bron + Waarschuwing: als een manga hernoemt wordt zal deze worden verwijderd uit de downloadwachtrij (indien aanwezig). + Aan het inloggen… + Auteur + Tekenaar + Mogelijke duplicaten + Je hebt items in jouw bibliotheek met een gelijkaardige naam.\n\nSelecteer een item om te migreren of voeg toch toe. + Privé getrackt + Track privé + Track openbaar + Vond het deel leuk waar… + Geselecteerd + Beschikbaar + Selecteer alle + Selecteer geen + Selecteer ingeschakelde bronnen + Selecteer vastgepinde bronnen + Ga door + Data om te migreren + Verwijder downloads van huidig item na migratie + Aanvullende trefwoorden (optioneel) + Helpt bij het verfijnen van zoekresultaten door extra trefwoorden toe te voegen + Verberg items zonder een match + Verberg items zonder nieuwere hoofdstukken + Toon item enkel als de match meer hoofdstukken heeft + Deze opties zijn traag en gevaarlijk en kunnen leiden tot restricties van bronnen + Geavanceerde zoekmodus + Splitst de titel op in trefwoorden voor een breedere zoekopdracht + Match op basis van hoofdstuknummer + Indien ingeschakeld wordt de match die het verst vooruit is gekozen. Anders word de eerste match op basis van bronprioriteit gekozen. + Migratie + Migratie (%1$d/%2$d) + Kopieer + Migreer + Geen alternatieven gevonden + Recentste: %1$s + Onbekend + Zoek manueel + Niet migreren + Migreer nu + Kopieer nu + Stoppen met migreren? + Stop + Annuleer + Kopieer + Migreer + Annuleer + Annuleer + Geen hoofdstukken gevonden. Dit item kan niet worden gebruikt voor migratie diff --git a/i18n/src/commonMain/moko-resources/pt/plurals.xml b/i18n/src/commonMain/moko-resources/pt/plurals.xml index ff6cd10076..b19eafe990 100644 --- a/i18n/src/commonMain/moko-resources/pt/plurals.xml +++ b/i18n/src/commonMain/moko-resources/pt/plurals.xml @@ -105,4 +105,9 @@ Foram saltadas %1$d entradas Foram saltadas %1$d entradas + + %1$s página + %1$s páginas + %1$s páginas + diff --git a/i18n/src/commonMain/moko-resources/pt/strings.xml b/i18n/src/commonMain/moko-resources/pt/strings.xml index 870ce46002..e11e6e6538 100644 --- a/i18n/src/commonMain/moko-resources/pt/strings.xml +++ b/i18n/src/commonMain/moko-resources/pt/strings.xml @@ -6,12 +6,12 @@ Biblioteca Histórico Atualizações - Cópia de segurança e restauração + Cópia de segurança e restauro Definições Filtro Não Lido Remover filtro - Procurar + Pesquisar Selecionar tudo Marcar como lido Marcar como não lido @@ -24,7 +24,7 @@ Editar categorias Renomear categoria Definir categorias - Alterar capa + Editar capa Pausar Capítulo anterior Capítulo seguinte @@ -32,7 +32,7 @@ Remover Resumir Abrir no navegador - Modo de visualização + Modo de exibição Cancelar Ordenar Instalar @@ -42,7 +42,7 @@ Transferências Avançado Sobre - Tamanho da grade + Itens por linha Vertical Horizontal Atualizações automáticas @@ -162,20 +162,20 @@ Não foi possível transferir o capítulo devido a um erro inesperado A ligação Wi-Fi está indisponível Categorias - Itens da biblioteca + Entradas da biblioteca Monitorização Histórico Extensões - Info. da extensão + Informação da extensão Marcado Alfabeticamente Total de capítulos Última leitura - Procura geral + Pesquisa geral Marcar capítulo Desmarcar capítulo Adicionar - Mostrar + Exibir Grelha compacta Lista Partilhar @@ -194,20 +194,16 @@ Instalado Desinstalar Extensão não confiável - Esta extensão possui um certificado não confiável e não foi ativada. -\n -\nUma extensão maliciosa podia ler qualquer credencial de entrada armazenada no Mihon ou executar código arbitrário. -\n -\nAo confiar neste certificado serão aceites estes riscos. + Esta extensão maliciosa pode ler qualquer credenciais de sessão guardadas ou executar código arbitrário. \n \nAo confiar neste extensão, você aceita estes riscos. Cortar bordas Filtro de cor personalizado Inverter teclas de volume Sem animação Normal Rápido - G - B - A + Verde + Azul + Alfa Transferir novos capítulos Criar cópia de segurança Pode ser usado para restaurar a biblioteca atual @@ -222,7 +218,7 @@ Listas Velocidade de animação de toque duplo Paginação - R + Vermelho Cópia de segurança criada Restauro completo O que pretende fazer cópia de segurança? @@ -303,7 +299,7 @@ Ligado Seguir o do sistema Gerir notificações - Segurança e privacidade. + Segurança e privacidade Requerer desbloqueio Bloquear quando inativo Sempre @@ -338,7 +334,7 @@ Página longa com espaços Ignorar capítulos filtrados Desafixar - Fixar + Afixar Seleção inversa Fontes Sítio Web @@ -360,7 +356,7 @@ Verificar por atualizações Licenças de código aberto Filtra todos os itens nasua biblioteca - %02d min, %02d seg + %02d min., %02d seg. Cinza Modo de leitura Para esta série @@ -374,11 +370,11 @@ Dados Fontes em falta: O backup não possui nenhum item da biblioteca. - Ficheiro de cópia de segurança invalido + Ficheiro de cópia de segurança inválido: Mostrar modo de leitura Procurar nova capa e detalhes quando a biblioteca atualizar Atualizar automaticamente os metadados - Mostrar abas de categoria + Mostrar separadores de categoria Grelha confortável Migrar Desativar todas @@ -452,9 +448,7 @@ Dividir as páginas longas Se a posição das páginas longas divididas não se adequar ao modo de leitura Inverter a posição das páginas divididas - Os dados da cópia de segurança serão restaurados. -\n -\nPrecisa instalar as extensões em falta e depois iniciar sessão nos serviços de monitorização para usá-los. + Pode ter que instalar quaisquer extensões em falta e iniciar a sessão para rastrear os serviços depois de os utilizar. Direita Esquerda Seguinte @@ -486,7 +480,7 @@ Automático Desligado Ligado - Yin & Yang + Yin e Yang Tako Daiquiri de Morango Crepúsculo da Meia-Noite @@ -518,9 +512,9 @@ Hoje Dinâmico Aviso - Autentifique-se para confirmar a mudança - Padrão - Total de itens + Autenticar para confirmar a alteração + Predefinição + Total de entradas Idioma Aparência Só com Wi-Fi @@ -560,7 +554,7 @@ Em hiato Publicação concluída Cancelado - Mostrar o item + Mostrar entrada Desativado Grelha apenas de capas Fechar @@ -580,7 +574,7 @@ Ampliar imagem horizontal Abrir no GitHub Erro ao guardar a imagem - Último mangá atualizado + Última verificação da atualização Contagem de não lidos Melhora o desempenho do leitor Bem, isto é estranho @@ -593,15 +587,15 @@ Não foi possível encontrar o caminho do ficheiro da página %d Multi Transferência automática durante leitura - Deseja apagar a categoria \"%s\"? - Apagar categoria + Deseja eliminar a categoria \"%s\"? + Eliminar categoria InternalError: Verifique registos de falhas para mais informações Cadeia de agente de utilizador não pode estar em branco Tem a certeza? Última atualização da biblioteca: %s Veja os seus itens da biblioteca atualizados recentemente Está prestes a remover \"%s\" da sua biblioteca - Apenas funciona em entradas na biblioteca e se o capítulo atual, mais o próximo, já estiverem transferidos + Funciona apenas se o capítulo atual, mais o próximo, já estiverem transferidos. Maremoto Idioma da aplicação Versão @@ -628,15 +622,15 @@ Ignorado porque a série não requer atualizações Pesquisar… Permissões de armazenamento não concedidas - Botão de continuar lendo + Botão de continuar a ler Tema, data e formato de hora Categorias, atualização global, trocar de capítulo Modo leitura, exibir, navegação - Abrir mangá aleatório - Estatisticas + Abrir entrada aleatória + Estatísticas Começado Local - Baixado + Transferido Título desconhecido Copiado para a área de transferência %dd @@ -670,7 +664,7 @@ %dm Agora não Itens monitorados - Avaliação média + Pontuação média Usados %ds A verificar as transferências @@ -690,19 +684,19 @@ Sobreposição Girar páginas largas para caber Virar a orientação de páginas largas giradas - Ação de deslizar para a esquerda + Capítulo ao deslizar para a esquerda Toque duplo para aproximar Definir intervalo Fora do período esperado de lançamento Informações de depuração - Ação de deslizar para a direita + Capítulo ao deslizar para a direita intervalos Estimado a cada - Intervalo de busca customizado + Frequência da atualização personalizada Próxima atualização esperada Definido para atualizar a cada Pulado, pois nenhum lançamento é esperado para hoje - Apagar download + Eliminar transferido Selecionado Não selecionado Mais opções @@ -737,10 +731,10 @@ A sincronizar a biblioteca A atualizar a biblioteca… (%s) HTTP %d, verifique o site na WebView - Avaliação no monitorador + Pontuação do monitorizador Aplicar OK - Reverter para o padrão + Reverter para predefinição Bem-vindo(a)! Pular Selecionar uma pasta @@ -784,7 +778,7 @@ \nPasta selecionada: %2$s Apagar scanlators Nenhum scanlator encontrado - Mover série para o final + Mover série para o fim Guia de introdução Atualização inteligente Revogar a confiabilidade de extensões desconhecidas @@ -801,7 +795,7 @@ Exibir as próximas atualizações A seguir Todas as entradas lidas - Copiar link + Copiar hiperligação Preto Branco Cópia de segurança JSON não suportada @@ -809,12 +803,12 @@ Repositórios de Extensões Aleatório Enviar dados de utilização anónimos para melhorar funções da aplicação. - A enviar logs de crash e estatísticas para permitir-nos identificar e resolver problemas, melhorar a performance e realizar futuras atualizações que sejam mais revelantes aos teus desejos + Se enviar os registos de crache e as analíticas irá permitir-nos identificar e resolver problemas, melhorar o desempenho, e realizar futuras atualizações que sejam mais relevantes para as suas necessidades Estatíscas e Logs de Crash Atualizar progresso quando for marcado como lido Este mangá ou está completo ou ainda não tem uma data de lançamento prevista. - Trackers atualizados para o capítulo %d - Erro ao adquirir acesso persistente à pasta. A aplicação pode apresentar certos erros + Rastreadores atualizados para o capítulo %d + Erro ao adquirir o acesso persistente à pasta. A aplicação pode comportar-se inesperadamente. Enviar logs de crash Enviar logs de crash anónimos para os desenvolvedores. Permitir estatísticas @@ -824,11 +818,16 @@ Remover Remover Extensão? Queres mesmo remover a extensão: \"%s\"? - Ignorar dar download a capítulos já lidos duplicados - "Atualizar os tracker para o capítulo %d?" + Ignorar a transferência dos capítulos lidos duplicados + Atualizar os rastreadores para o capítulo %d? Desejas adicionar o seguinte repositório: \"%s\"? Automático Manter entradas com capítulos lidos Notas Editar notas + Artista + Autor + Equipa de tradução + Doar + Capítulos não lidos diff --git a/i18n/src/commonMain/moko-resources/ro/strings.xml b/i18n/src/commonMain/moko-resources/ro/strings.xml index e07f4d9792..d85b623df9 100644 --- a/i18n/src/commonMain/moko-resources/ro/strings.xml +++ b/i18n/src/commonMain/moko-resources/ro/strings.xml @@ -498,7 +498,7 @@ Ignorata deoarece seria este completa Ignorat din cauza lipsei de capitolel citite Format de capitol invalid - Atentie : actualizarile mari la gramada vor face sursele mai incete si pot/vor bloca Mihon. Apasa pentru mai multe informatii. + Atenție : actualizarile mari în masă vor face sursele mai incete și/sau vor bloca %s. Apăsați pentru mai multe informatii. Ghidul de inceput %1$d actualizari esuate Ignorata deoarece sunt capitole necitite @@ -754,7 +754,7 @@ Repozitoriu extensii Nu aveți nici un repozitoriu configurat. Adăugați repozitoriu - Adăugați repozitorii adiționale pentru Mihon. Acestea ar trebuii să fie URL-uri care se încheie cu \"index.min.json\". + Adăugați repozitorii adiționale pentru %s. Acestea ar trebuii să fie URL-uri care se încheie cu \"index.min.json\". Doriți să ștergeți repozitoriul \"%s\"? Repozitoriu open source Nici o locație pentru stocare nu a fost setată @@ -833,4 +833,76 @@ Afectează performanța. Activați numai dacă reducerea pragului bitmap nu rezolvă problemele legate de imaginile goale Automatic Întrerupeți istoricul de lectură pentru extensie + Donează + Capitole necitite + Notițe + Editează notițe + Catppuccino + Monocromatic + Afișați imagini în descrierile benzilor desenate + Comportament + Marcați capitolele duplicate ca citite + După citirea unui capoitol + După aducerea noilor capitole + Ascunde indicatoarele pentru capitolele absente + Utilizați decodurul vechi pentru tipul bandă lungă + Directorul pentru descărcări nu a putut fi creat + Directorul: %s nu a putut fi creat + Exportă + Listă biblioteci + Bibliotecă exportată + Ești pe cale să elimini intrări din baza de date + Capitolele citite și progresul intrărilor care nu sunt în bibliotecă vor fi pierdute + Păstrați intrările cu capitole citite + Actualizați titlurile benzilor desenate din bibliotecă pentru a le potrivi cu sursa + Atenție: dacă o bandă desenată este redenumită, aceasta va fi eliminată din coada de descărcare (dacă este prezenă). + Conectare… + Autor + Artist + Posibile duplicate + Aveți intrări cu un nume similar în bibliotecă.\n\nSelectați o intrare pentru migrare sau adăugați oricum. + Urmărit în mod privat + Urmăriți în mod privat + Urmăriți în mod public + Mi-a plăcut partea în care… + Selectat + Disponibil + Selectați tot + Selectați niciunul + Selectați sursele active + Selectați sursele fixate + Continuați + Date de migrat + Ștergeți descărcările intrării curente după migrare + Cuvinte cheie suplimentare (opțional) + Ajutați la restrângerea rezultatelor căutării prin adăugarea de cuvinte cheie suplimentare + Ascundeți intrările fără potrivire + Ascundeți intrările fără capitole mai noi + Afișați intrarea doar dacă are capitole suplimentare + Aceste opțiuni sunt lente și periculoase și pot duce la restricții din partea surselor + Mod de căutare avansată + Împarte titlul în cuvinte cheie pentru o căutare mai amplă + Potrivire în funcție de numărul capitolului + Dacă este activată, alege potrivirea cea mai înaintată. În caz contrar, alege prima potrivire după prioritatea sursei. + Migrare + Migrare (%1$d/%2$d) + Copiați + Migarți + Nu a fost găsită nici o alternativă + Cel mai recent: %1$s + Necunoscut + Căutare manuală + Nu migrați + Migrați acum + Copiați acum + Opriți migrarea? + Opriți + Anulați + Copiați + Migrați + Anulați + Anulați + Nu s-au găsit capitole, această intrare nu poate fi utilizată pentru migrare + Nu permiteți nume de fișiere non-ASCII + Asigurți compatibilitatea cu anumite medii de stocare care nu suportă Unicode. Când această opțiune este activată, va trebui să redenumiți manual directoarele sursă și cele de manga, înlocuind caracterele non-ASCII cu reprezentările lor hexadecimale UTF-8 cu litere mici. Fișierele capitolelor nu trebuie redenumite. diff --git a/i18n/src/commonMain/moko-resources/ru/strings.xml b/i18n/src/commonMain/moko-resources/ru/strings.xml index dac02f34e4..2082de1ed4 100644 --- a/i18n/src/commonMain/moko-resources/ru/strings.xml +++ b/i18n/src/commonMain/moko-resources/ru/strings.xml @@ -542,7 +542,7 @@ Настоятельно рекомендуется хранить резервные копии в других местах или сервисах. Резервные копии могут содержать конфиденциальную информацию, как, например, пароли. Будьте осторожны при их отправке. Только по Wi-Fi Каждые 3 дня - Предупреждение: Большое количество загрузок может привести к замедлению работы источников и/или блокировке Mihon. Нажмите для подробностей. + Предупреждение: Большое количество загрузок может привести к замедлению работы источников и/или блокировке %s. Нажмите для подробностей. Обновить все Обновления приложения Очищать кэш глав при запуске приложения @@ -772,7 +772,7 @@ Этот репозиторий уже существует! Умное обновление Недопустимый URL-адрес репозитория - Добавить дополнительные репозиторий в Mihon. Это должны быть URL-адреса которые заканчиваться на \"index.min.json\". + Добавить дополнительные репозиторий в %s. Это должны быть URL-адреса которые заканчиваться на \"index.min.json\". Хотите ли вы удалить репозиторий \"%s\"? Удалить репозиторий Добавить репозиторий @@ -903,4 +903,6 @@ Скрывать индикаторы отсутствующих глав Отрисововать изображения в описаниях серий Спонсорство + Не позволять наименования файлов в виде non-ASCII + Обеспечивает совместимость с некоторыми носителями информации, которые не поддерживают Unicode. Когда этот функция включена, вам нужно будет вручную переименовать папки серий и источников, заменив non-ASCII символы на шестнадцатеричные UTF-8 в нижнем регистре. Файлы глав можно не переименовать. diff --git a/i18n/src/commonMain/moko-resources/sk/plurals.xml b/i18n/src/commonMain/moko-resources/sk/plurals.xml index 32aef55a87..f9eb1f5360 100644 --- a/i18n/src/commonMain/moko-resources/sk/plurals.xml +++ b/i18n/src/commonMain/moko-resources/sk/plurals.xml @@ -65,4 +65,22 @@ %d kategórie %d kegórií + + Zajtra + O %1$d dni + O %1$d dní + O %1$d dní + + + 1 deň + %d dni + %d dní + %d dní + + + 1 strana + %1$s strany + %1$s strán + %1$s strán + diff --git a/i18n/src/commonMain/moko-resources/sk/strings.xml b/i18n/src/commonMain/moko-resources/sk/strings.xml index b16a9ee175..047cdfc510 100644 --- a/i18n/src/commonMain/moko-resources/sk/strings.xml +++ b/i18n/src/commonMain/moko-resources/sk/strings.xml @@ -662,4 +662,5 @@ Vitajte! Nadchádzajúce Nahradiť + Navigovať hore diff --git a/i18n/src/commonMain/moko-resources/th/strings.xml b/i18n/src/commonMain/moko-resources/th/strings.xml index 14fa10b8a9..db2e61589e 100644 --- a/i18n/src/commonMain/moko-resources/th/strings.xml +++ b/i18n/src/commonMain/moko-resources/th/strings.xml @@ -628,7 +628,7 @@ หมวดหมู่, การอัปเดตคลัง, การปัดรายการตอน โหมดการอ่าน, การแสดงผล, การนำทาง การดาวน์โหลดอัตโนมัติ, การดาวน์โหลดล่วงหน้า - การประมวลผลซิงก์ทางเดียง, เสริมการวิงก์ + การอัพเดทความคืบหน้าหลังอ่าน, การซิงค์กับแหล่งที่มาภายนอก แหล่งที่มา, ส่วนขยาย, การค้นหาทั้งหมด การสำรองข้อมูลและพื้นที่เก็บข้อมูลด้วยตนเองและอัตโนมัติ การล็อกแอป, หน้าจอความปลอดภัย @@ -848,4 +848,7 @@ รายการคลัง ส่งออกคลังแล้ว คุณกำลังจะลบรายการออกจากฐานข้อมูล + บริจาค + เรนเดอร์รูปภาพในคำอธิบายเรื่อง + ไม่อนุญาตชื่อไฟล์ที่ไม่ใช่ ASCII diff --git a/i18n/src/commonMain/moko-resources/tr/plurals.xml b/i18n/src/commonMain/moko-resources/tr/plurals.xml index f8f606e89b..e4222dc4ce 100644 --- a/i18n/src/commonMain/moko-resources/tr/plurals.xml +++ b/i18n/src/commonMain/moko-resources/tr/plurals.xml @@ -25,8 +25,8 @@ %1$s kaldı - %d kategori - %d kategori + %d Kategori + %d Kategoriler %1$s içinde %2$s hatayla tamamlandı diff --git a/i18n/src/commonMain/moko-resources/tr/strings.xml b/i18n/src/commonMain/moko-resources/tr/strings.xml index 348dad97af..97c6fbbf74 100644 --- a/i18n/src/commonMain/moko-resources/tr/strings.xml +++ b/i18n/src/commonMain/moko-resources/tr/strings.xml @@ -339,7 +339,7 @@ Sabitlenmiş Sabitlemeyi kaldır Sabitle - İzleme ekle + İzleyici ekle Kitaplıkta Kitaplığa ekle Daha az @@ -363,7 +363,7 @@ Okuma modu Bu seri için Cihaz ayarları açılamadı - Bölüm ilerlemesin harici izleyici hizmetlerine güncellemek için tek yönlü eşitleme. Her girdinin izleme düğmesinden izlemeyi ayarlayın. + Bölüm ilerlemesini harici izleyici hizmetlerine güncellemek için tek yönlü eşitleme. Her girdinin izleme düğmesinden izlemeyi ayarlayın. Kitaplıktakilerin kapaklarını yenile Yükleme tarihine göre Veri @@ -381,7 +381,7 @@ Tümünü etkinleştir Okuyucu açılınca kısaca okuma modunu göster Okuma modunu göster - Başlat + Başla Kaynak bulunamadı Devre dışı bırak Etkili olması için uygulamanın yeniden başlatılmasını gerektirir @@ -541,7 +541,7 @@ Ayrıntılı günlük kaydı Ayrıntılı günlükleri sistem günlüğüne yaz (uygulama performansını düşürür) Yalnızca kablosuz ağda - Uyarı: Büyük toplu indirmeler kaynakların yavaşlamasına ve/veya Mihon\'u engellemesine neden olabilir. Daha fazla bilgi için dokunun. + Uyarı: Büyük toplu indirmeler kaynakların yavaşlamasına ve/veya %s\'u engellemesine neden olabilir. Daha fazla bilgi için dokunun. 3 günde bir Tümünü güncelle Uygulama güncellemeleri @@ -772,7 +772,7 @@ Depolama kılavuzu Depo ekle Depo bağlantısı - Mihon\'a ek depolar ekleyin. Bu, \"index.min.json\" ile biten bir bağlantı olmalıdır. + %s\'a ek depolar ekleyin. Bu, \"index.min.json\" ile biten bir bağlantı olmalıdır. Bu depo zaten var! Depoyu sil Geçersiz depo bağlantısı @@ -796,7 +796,7 @@ Özel görünüm profili %1$s deposunun İmzalama Anahtarı Parmak İzi %2$s deposuyla aynı. \nEğer böyle olması gerekiyorsa %2$s ile değiştirilecek. Aksi takdirde depo yöneticinize ulaşın. - Dışa yakınlaştırmayı devre dışı bırak + Uzaklaştırmayı devre dışı bırak JSON yedekleri desteklenmiyor Yedek dosyası bozuk Bu manga ya tamamlanmış ya da tahmin edilen yayımlanma tarihi yok. @@ -903,4 +903,6 @@ Eksik bölüm göstergelerini gizle Manga açıklamalarında bulunan görselleri göster Bağış + ASCII olmayan dosya isimlerine izin verme + Unicode desteklemeyen bazı depolama sistemleri için uyumluluk sağlar. Etkinleştirildiğinde kaynak ve manga klasörlerini manuel olarak yeniden adlandırıp ASCII olmayan karakterleri küçük UTF-8 heksadesimal karşılıklarıyla değiştirmeniz gerekir. Bölüm dosyalarının yeniden adlandırılması gerekli değildir. diff --git a/i18n/src/commonMain/moko-resources/vi/strings.xml b/i18n/src/commonMain/moko-resources/vi/strings.xml index 05a20e71df..4e966a5182 100644 --- a/i18n/src/commonMain/moko-resources/vi/strings.xml +++ b/i18n/src/commonMain/moko-resources/vi/strings.xml @@ -542,7 +542,7 @@ Đang cài đặt tiện ích mở rộng… 3 ngày một lần Chỉ qua Wi-Fi - Cảnh báo: các tải xuống hàng loạt lớn có thể dẫn đến các nguồn trở nên chậm hơn và / hoặc chặn Mihon. Nhấn vào để tìm hiểu thêm. + Cảnh báo: các tải xuống hàng loạt lớn có thể dẫn đến các nguồn trở nên chậm hơn và / hoặc chặn %s. Nhấn vào để tìm hiểu thêm. Cập nhật ứng dụng Cập nhật tất cả Xóa bộ nhớ đệm các chương khi tắt ứng dụng @@ -773,7 +773,7 @@ Cập nhật thông minh Sắp tới Cập nhật từ phiên bản cũ hơn và không biết nên chọn gì? Tham khảo hướng dẫn để biết thêm thông tin. - Thêm nguồn bổ sung vào Mihon. Địa chỉ URL này cần phải kết thúc với \"index.min.json\". + Thêm nguồn bổ sung vào %s. Địa chỉ URL này cần phải kết thúc với \"index.min.json\". Kho lưu trữ %1$s có Dấu vân tay Khóa ký giống hệt như %2$s. \nNếu điều này là dự kiến, %2$s sẽ bị thay thế. Nếu không, vui lòng liên hệ với người quản lý kho lưu trữ của bạn. Bạn chưa có nguồn nào. diff --git a/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml b/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml index 1be3463337..c932f9cf59 100644 --- a/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml +++ b/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml @@ -542,7 +542,7 @@ 大量更新会损害图源,并可能导致更新变慢、耗电增加。点击了解详情。 仅连接 Wi-Fi 时 每 3 天 - 警告:批量下载可能导致图源变慢,甚至会使得它们屏蔽 Mihon。点击了解详情。 + 警告:批量下载可能导致图源变慢,甚至会使得它们屏蔽 %s 。点击了解详情。 全部更新 应用更新 启动时清除章节缓存 @@ -769,7 +769,7 @@ 插件仓库 尚未设置仓库 仓库网址 - 在 Mihon 中添加仓库,输入的网址结尾应为 \"index.min.json\" 。 + 在 %s 中添加仓库,输入的网址结尾应为 \"index.min.json\" 。 如果你是从旧版更新而来,可以查看存储指南了解详情。 存储指南 存储位置 @@ -848,9 +848,9 @@ 操作 未读章节 读完一个章节后 - 笔记 - 编辑笔记 - 我喜欢这段… + 添加注释 + 编辑注释 + 标注你喜欢的部分… 在你的书架中有一些名称相似的作品。\n\n请选择其中一个作品进行迁移或仍然新增。 可能重复的作品 你即将从数据库中删除这些作品 @@ -901,6 +901,6 @@ 未知 迁移 隐藏缺失章节提示符 - 在漫画简介中显示图片 + 在漫画注释中显示图片 捐赠 diff --git a/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml b/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml index 2ff6a0811a..3f69ffbdda 100644 --- a/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml +++ b/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml @@ -226,7 +226,7 @@ 請先將作品收藏至書櫃 選擇備份檔 尚無任何類別,輕觸新增按鈕即可建立類別以組織你的書櫃 - 下載管理員 + 下載管理 未讀 要將該圖片設為封面嗎? 正在載入頁面… @@ -539,7 +539,7 @@ 傾印詳細記錄至系統日誌 (將降低應用程式效能) 僅透過 Wi-Fi 每 3 天 - 警告:大量批次下載可能壅塞來源,甚至使其封鎖 Mihon,輕觸以瞭解詳情 + 警告:大量批次下載可能壅塞來源,甚至使其封鎖 %s,輕觸以瞭解詳情 全部更新 應用程式更新 啟動應用程式時清除章節快取 @@ -765,7 +765,7 @@ 已有該儲存庫! 智慧更新 無效的儲存庫網址 - 將額外的擴充套件儲存庫新增至 Mihon,此處應填入一個結尾為「index.min.json」的網址 + 將額外的擴充套件儲存庫新增至 %s,此處應填入一個結尾為「index.min.json」的網址 確定要刪除「%s」儲存庫嗎? 刪除儲存庫 新增儲存庫 @@ -894,4 +894,6 @@ 找不到章節,此項目無法用於遷移 在漫畫描述中顯示圖片 捐贈 + 禁止使用非 ASCII 檔名 + 確保與不支援 Unicode 的某些儲存媒體相容,啟用此選項後,你需要手動將來源與漫畫資料夾中的非 ASCII 字元改成對應的小寫 UTF-8 十六進位表示方式,章節檔案則不需要重新命名。 From 69eee8b1a49755df03d153b6eec3f51cfb2900bd Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sun, 2 Nov 2025 22:58:51 +0600 Subject: [PATCH 30/82] Migrated to the Android specific about libraries gradle plugin (cherry picked from commit 6d543024a32bba3136841a19942bed4ea8f0736b) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a0703d1fa8..5f9beb6619 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -108,7 +108,7 @@ stringSimilarity = { module = "com.aallam.similarity:string-similarity-kotlin", [plugins] google-services = { id = "com.google.gms.google-services", version = "4.4.4" } -aboutLibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutlib_version" } +aboutLibraries = { id = "com.mikepenz.aboutlibraries.plugin.android", version.ref = "aboutlib_version" } sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" } moko = { id = "dev.icerock.mobile.multiplatform-resources", version.ref = "moko" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version = "3.0.6" } From f2e0dcea315ff5acd3a6f4043dc573aafe1a8a8c Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Mon, 3 Nov 2025 05:38:47 +0100 Subject: [PATCH 31/82] Translations update from Hosted Weblate (#2639) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/es/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/fil/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/tr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/vi/ Translation: Mihon/Mihon Co-authored-by: Frosted Co-authored-by: Infy's Tagalog Translations Co-authored-by: Nguyễn Trung Đức Co-authored-by: Swyter (cherry picked from commit e36b4ce60b2b7141c5b6a4205e98853a0d07438b) --- i18n/src/commonMain/moko-resources/es/strings.xml | 3 +++ i18n/src/commonMain/moko-resources/fil/strings.xml | 3 +++ i18n/src/commonMain/moko-resources/tr/strings.xml | 3 +++ i18n/src/commonMain/moko-resources/vi/strings.xml | 5 +++++ 4 files changed, 14 insertions(+) diff --git a/i18n/src/commonMain/moko-resources/es/strings.xml b/i18n/src/commonMain/moko-resources/es/strings.xml index 62899dd2dc..4a0688b1c3 100644 --- a/i18n/src/commonMain/moko-resources/es/strings.xml +++ b/i18n/src/commonMain/moko-resources/es/strings.xml @@ -898,4 +898,7 @@ Ver imágenes en las descripciones de manga Prohibir los nombres de archivo que no sean ASCII Permite guardar tus datos en ciertos tipos de almacenamiento que no admitan Unicode. Al activarlo tendrás que renombrar las carpetas de tus fuentes y manga, pasándolas a representaciones UTF-8 en hexadecimal en minúscula. No tienes que hacer lo mismo con las carpetas de capítulos. + Descarga simultánea desde fuentes + Descarga simultánea de páginas + Cantidad de páginas a descargar simultáneamente desde cada fuente remota diff --git a/i18n/src/commonMain/moko-resources/fil/strings.xml b/i18n/src/commonMain/moko-resources/fil/strings.xml index 8bfa7cacd9..e96a5892cb 100644 --- a/i18n/src/commonMain/moko-resources/fil/strings.xml +++ b/i18n/src/commonMain/moko-resources/fil/strings.xml @@ -903,4 +903,7 @@ Mag-donate Di-payagan ang mga non-ASCII na filename Tinitiyak ang pagiging tugma sa ilang partikular na storage media na hindi sumusuporta sa Unicode. Kapag napagana ito, kakailanganin mong manu-manong palitan ang pangalan ng source at manga folder sa pamamagitan ng pagpapalit ng mga hindi ASCII na character ng kanilang lowercase na UTF-8 hexadecimal na representasyon. Hindi kailangang palitan ng pangalan ang mga file ng kabanata. + Kasabay na pag-download ng source + Kasabay na pag-download ng pahina + Mga pahina na nai-download nang sabay-sabay kada source diff --git a/i18n/src/commonMain/moko-resources/tr/strings.xml b/i18n/src/commonMain/moko-resources/tr/strings.xml index 97c6fbbf74..182ed59060 100644 --- a/i18n/src/commonMain/moko-resources/tr/strings.xml +++ b/i18n/src/commonMain/moko-resources/tr/strings.xml @@ -905,4 +905,7 @@ Bağış ASCII olmayan dosya isimlerine izin verme Unicode desteklemeyen bazı depolama sistemleri için uyumluluk sağlar. Etkinleştirildiğinde kaynak ve manga klasörlerini manuel olarak yeniden adlandırıp ASCII olmayan karakterleri küçük UTF-8 heksadesimal karşılıklarıyla değiştirmeniz gerekir. Bölüm dosyalarının yeniden adlandırılması gerekli değildir. + Tek seferde indirilen sayfalar + Her kaynak için aynı anda indirilen sayfalar + Tek seferde indirilen kaynaklar diff --git a/i18n/src/commonMain/moko-resources/vi/strings.xml b/i18n/src/commonMain/moko-resources/vi/strings.xml index 4e966a5182..ec645d70ee 100644 --- a/i18n/src/commonMain/moko-resources/vi/strings.xml +++ b/i18n/src/commonMain/moko-resources/vi/strings.xml @@ -903,4 +903,9 @@ Không tìm thấy chương nào, mục này không thể được sử dụng để di chuyển Quyên góp Hiển thị hình ảnh trong mô tả manga + Không cho phép tên tệp không phải định dạng ASCII + Đảm bảo khả năng tương thích với một số phương tiện lưu trữ nhất định không hỗ trợ Unicode. Khi tính năng này được bật, bạn sẽ cần đổi tên thủ công các thư mục nguồn và manga bằng cách thay thế các ký tự không phải ASCII bằng cách biểu diễn thập lục phân UTF-8 chữ thường của chúng. Các tập tin chương không cần phải đổi tên. + Tải xuống nguồn đồng thời + Tải xuống trang đồng thời + Các trang được tải xuống đồng thời theo từng nguồn From f55b099221bec6bb6a4477ca7de1f4fd8bed7a6e Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 3 Nov 2025 04:52:45 +0000 Subject: [PATCH 32/82] Update dependency androidx.compose:compose-bom to v2025.10.01 (#2522) (cherry picked from commit e8bdf58530cdfd6d530ea9a282785bd313e69be4) --- gradle/compose.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index f1b9b2d584..11e93a1f46 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -1,5 +1,5 @@ [versions] -compose-bom = "2025.09.00" +compose-bom = "2025.10.01" [libraries] activity = "androidx.activity:activity-compose:1.11.0" From 6e3ce5314eeea747020d1db7664986d28186693b Mon Sep 17 00:00:00 2001 From: bapeey <90949336+bapeey@users.noreply.github.com> Date: Tue, 4 Nov 2025 06:43:40 +0100 Subject: [PATCH 33/82] Fix WebView crash introduced in v0.19.2 (#2649) (cherry picked from commit bdb0ce4779d565fc528e97bd38133a72ff3c1724) --- .../webview/WebViewScreenContent.kt | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt index 48ae0004c5..7c1751f6b5 100644 --- a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt +++ b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt @@ -133,21 +133,20 @@ fun WebViewScreenContent( view: WebView?, request: WebResourceRequest?, ): Boolean { - request?.let { - // Don't attempt to open blobs as webpages - if (it.url.toString().startsWith("blob:http")) { - return false - } + val url = request?.url?.toString() ?: return false + + // Ignore intents urls + if (url.startsWith("intent://")) return true - // Ignore intents urls - if (it.url.toString().startsWith("intent://")) { + // Only open valid web urls + if (url.startsWith("http") || url.startsWith("https")) { + if (url != view?.url) { + view?.loadUrl(url, headers) return true } - - // Continue with request, but with custom headers - view?.loadUrl(it.url.toString(), headers) } - return super.shouldOverrideUrlLoading(view, request) + + return false } } } From 4d21ec058a38e6751919fe9faa7bce8a45baceb9 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Tue, 4 Nov 2025 08:04:46 +0100 Subject: [PATCH 34/82] Translations update from Hosted Weblate (#2646) Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/nl/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/hr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/id/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/jv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ms/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/tr/ Translation: Mihon/Mihon Translation: Mihon/Mihon Plurals Co-authored-by: Frosted Co-authored-by: Milo Ivir Co-authored-by: Nataniel Dika Kurniawan Co-authored-by: Siebrenvde (cherry picked from commit 5e428071c9a12bc637cbfcf235a33dc19cdef197) --- i18n/src/commonMain/moko-resources/hr/strings.xml | 3 +++ i18n/src/commonMain/moko-resources/in/strings.xml | 3 +++ i18n/src/commonMain/moko-resources/jv/strings.xml | 3 +++ i18n/src/commonMain/moko-resources/ms/strings.xml | 3 +++ i18n/src/commonMain/moko-resources/nl/plurals.xml | 14 +++++++++++++- i18n/src/commonMain/moko-resources/tr/strings.xml | 6 +++--- 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/i18n/src/commonMain/moko-resources/hr/strings.xml b/i18n/src/commonMain/moko-resources/hr/strings.xml index 78bca1ae6f..99faa7c39e 100644 --- a/i18n/src/commonMain/moko-resources/hr/strings.xml +++ b/i18n/src/commonMain/moko-resources/hr/strings.xml @@ -905,4 +905,7 @@ Iscrtaj slike u opisima manga Zabrani imena datoteka koji nisu u ASCII formatu Osigurava kompatibilnost s određenim medijima za spremanje podataka koji ne podržavaju Unicode. Kada je ova opcija aktivirana, morat ćeš ručno preimenovati izvor i mape s mangama zamjenjivanjem znakova koji nisu ASCII s njihovim UTF-8 heksadecimalnim vrijednostima (u malim slovima). Datoteke poglavlja se ne moraju preimenovati. + Istovremena preuzimanja izvora + Istovremena preuzimanja stranica + Istovremeno preuzete stranice po izvoru diff --git a/i18n/src/commonMain/moko-resources/in/strings.xml b/i18n/src/commonMain/moko-resources/in/strings.xml index 94e213ec34..5fad13bfb0 100644 --- a/i18n/src/commonMain/moko-resources/in/strings.xml +++ b/i18n/src/commonMain/moko-resources/in/strings.xml @@ -905,4 +905,7 @@ Tidak ditemukan bab, entri ini tidak dapat digunakan untuk migrasi Jangan izinkan nama file non-ASCII Memastikan kompatibilitas dengan beberapa media penyimpanan yang tidak mendukung Unicode. Jika opsi ini diaktifkan, Anda harus mengganti nama folder sumber dan manga secara manual dengan mengganti karakter non-ASCII menjadi representasi heksadesimal UTF-8 huruf kecil. File chapter tidak perlu diganti namanya. + Ambil berkas sumber secara bersamaan + Ambil berkas halaman secara bersamaan + Halaman yang diunduh secara bersamaan per sumber diff --git a/i18n/src/commonMain/moko-resources/jv/strings.xml b/i18n/src/commonMain/moko-resources/jv/strings.xml index 173a52b1da..8a4ca343c2 100644 --- a/i18n/src/commonMain/moko-resources/jv/strings.xml +++ b/i18n/src/commonMain/moko-resources/jv/strings.xml @@ -313,4 +313,7 @@ Bikak kunci %s Trapake jeda wayah Nganyari panyaris frekuensi + nganyari kang diarep-arep sabanjure + Skor pelacak + mawut diff --git a/i18n/src/commonMain/moko-resources/ms/strings.xml b/i18n/src/commonMain/moko-resources/ms/strings.xml index 3c1578de12..851cc3731d 100644 --- a/i18n/src/commonMain/moko-resources/ms/strings.xml +++ b/i18n/src/commonMain/moko-resources/ms/strings.xml @@ -904,4 +904,7 @@ Tidak ada bab yang dijumpai, entri ini tidak dapat digunakan untuk penghijrahan Tidak benarkan nama fail bukan ASCII Memastikan keserasian dengan media penyimpanan tertentu yang tidak menyokong Unicode. Apabila ini diaktifkan, anda perlu menamakan semula folder sumber dan manga secara manual dengan menggantikan aksara bukan-ASCII dengan representasi heksadesimal UTF-8 huruf kecil mereka. Fail bab tidak perlu dinamakan semula. + Muat turun sumber serentak + Muat turun halaman serentak + Halaman yang dimuat turun secara serentak setiap sumber diff --git a/i18n/src/commonMain/moko-resources/nl/plurals.xml b/i18n/src/commonMain/moko-resources/nl/plurals.xml index 803f25ad92..44805cca4c 100644 --- a/i18n/src/commonMain/moko-resources/nl/plurals.xml +++ b/i18n/src/commonMain/moko-resources/nl/plurals.xml @@ -76,4 +76,16 @@ %d repo %d repo\'s - \ No newline at end of file + + %1$d item migreren? + %1$d items migreren? + + + %1$d item kopiëren? + %1$d items kopiëren? + + + Een item werd overgeslagen + %1$d items werden overgeslagen + + diff --git a/i18n/src/commonMain/moko-resources/tr/strings.xml b/i18n/src/commonMain/moko-resources/tr/strings.xml index 182ed59060..3ee3673b07 100644 --- a/i18n/src/commonMain/moko-resources/tr/strings.xml +++ b/i18n/src/commonMain/moko-resources/tr/strings.xml @@ -905,7 +905,7 @@ Bağış ASCII olmayan dosya isimlerine izin verme Unicode desteklemeyen bazı depolama sistemleri için uyumluluk sağlar. Etkinleştirildiğinde kaynak ve manga klasörlerini manuel olarak yeniden adlandırıp ASCII olmayan karakterleri küçük UTF-8 heksadesimal karşılıklarıyla değiştirmeniz gerekir. Bölüm dosyalarının yeniden adlandırılması gerekli değildir. - Tek seferde indirilen sayfalar - Her kaynak için aynı anda indirilen sayfalar - Tek seferde indirilen kaynaklar + Tek seferde indirilen sayfa sayısı + Her kaynak için aynı anda indirilen sayfa sayısı + Tek seferde indirilen kaynak sayısı From bbcf5cd369c3e61bb30307af2c9f8278c07b358e Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Tue, 4 Nov 2025 13:05:23 +0600 Subject: [PATCH 35/82] Revert "Update dependency androidx.compose:compose-bom to v2025.10.01 (#2522)" This reverts commit e8bdf58530cdfd6d530ea9a282785bd313e69be4. (cherry picked from commit ace387f8bf8f451887b8055213be78312a5b4ea7) --- gradle/compose.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index 11e93a1f46..f1b9b2d584 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -1,5 +1,5 @@ [versions] -compose-bom = "2025.10.01" +compose-bom = "2025.09.00" [libraries] activity = "androidx.activity:activity-compose:1.11.0" From efb36873d6d8617a3b62df19dfab701bdfee1b53 Mon Sep 17 00:00:00 2001 From: NGB-Was-Taken <76197326+NGB-Was-Taken@users.noreply.github.com> Date: Fri, 7 Nov 2025 15:05:32 +0545 Subject: [PATCH 36/82] Upload test report as artifact on failure (#2664) (cherry picked from commit 9f9155121cb2fa75c9b2c9a2796f3a1dac6b15e7) --- .github/workflows/build.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f44a35e4c0..ad4274361b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -56,8 +56,16 @@ jobs: run: ./gradlew assembleRelease -Penable-updater - name: Run unit tests + id: unit_tests run: ./gradlew testReleaseUnitTest + - name: Upload test report + if: steps.unit_tests.outcome == 'failure' + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + with: + name: test-report-${{ github.sha }} + path: app/build/reports/tests/testReleaseUnitTest + - name: Upload APK uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: From c8a92d6ed2463430167b79c48e4390866782fc16 Mon Sep 17 00:00:00 2001 From: NGB-Was-Taken <76197326+NGB-Was-Taken@users.noreply.github.com> Date: Fri, 7 Nov 2025 15:06:17 +0545 Subject: [PATCH 37/82] Fix flaky migration tests (#2663) (cherry picked from commit 506d51a007e730594e4e5f05f00b4f94c4f24e05) --- .../test/java/mihon/core/migration/MigratorTest.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/test/java/mihon/core/migration/MigratorTest.kt b/app/src/test/java/mihon/core/migration/MigratorTest.kt index eaaf7f088f..2f8070676a 100644 --- a/app/src/test/java/mihon/core/migration/MigratorTest.kt +++ b/app/src/test/java/mihon/core/migration/MigratorTest.kt @@ -1,9 +1,11 @@ package mihon.core.migration +import io.kotest.assertions.nondeterministic.eventually import io.mockk.slot import io.mockk.spyk import io.mockk.verify import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.newSingleThreadContext @@ -17,6 +19,7 @@ import org.junit.jupiter.api.Assertions.assertInstanceOf import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import kotlin.time.Duration.Companion.seconds class MigratorTest { @@ -26,7 +29,7 @@ class MigratorTest { lateinit var migrationStrategyFactory: MigrationStrategyFactory @BeforeEach - fun initilize() { + fun initialize() { migrationContext = MigrationContext(false) migrationJobFactory = spyk(MigrationJobFactory(migrationContext, CoroutineScope(Dispatchers.Main + Job()))) migrationCompletedListener = spyk(block = {}) @@ -45,7 +48,7 @@ class MigratorTest { verify { migrationJobFactory.create(capture(migrations)) } assertEquals(1, migrations.captured.size) - verify { migrationCompletedListener() } + eventually(2.seconds) { verify { migrationCompletedListener() } } } @Test @@ -86,7 +89,7 @@ class MigratorTest { verify { migrationJobFactory.create(capture(migrations)) } assertEquals(2, migrations.captured.size) - verify { migrationCompletedListener() } + eventually(2.seconds) { verify { migrationCompletedListener() } } } @Test @@ -114,7 +117,7 @@ class MigratorTest { verify { migrationJobFactory.create(capture(migrations)) } assertEquals(10, migrations.captured.size) - verify { migrationCompletedListener() } + eventually(2.seconds) { verify { migrationCompletedListener() } } } @Test @@ -135,11 +138,12 @@ class MigratorTest { verify { migrationJobFactory.create(capture(migrations)) } assertEquals(2, migrations.captured.size) - verify { migrationCompletedListener() } + eventually(2.seconds) { verify { migrationCompletedListener() } } } companion object { + @OptIn(DelicateCoroutinesApi::class) val mainThreadSurrogate = newSingleThreadContext("UI thread") @BeforeAll From 7047e92eda7d62309f45a3b2d187251ed5814c5b Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 7 Nov 2025 09:22:41 +0000 Subject: [PATCH 38/82] Update dependency androidx.core:core-splashscreen to v1.2.0 (#2661) (cherry picked from commit f4703ed83a32afe1d39669f4988233c1fe7c3f32) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 734f735fdc..8d4707e262 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -12,7 +12,7 @@ appcompat = "androidx.appcompat:appcompat:1.7.1" biometricktx = "androidx.biometric:biometric-ktx:1.2.0-alpha05" constraintlayout = "androidx.constraintlayout:constraintlayout:2.2.1" corektx = "androidx.core:core-ktx:1.17.0" -splashscreen = "androidx.core:core-splashscreen:1.0.1" +splashscreen = "androidx.core:core-splashscreen:1.2.0" recyclerview = "androidx.recyclerview:recyclerview:1.4.0" viewpager = "androidx.viewpager:viewpager:1.1.0" profileinstaller = "androidx.profileinstaller:profileinstaller:1.4.1" From 8829aa9bc9b047268a2af0748422ff6625e2b472 Mon Sep 17 00:00:00 2001 From: Trevor Paley <10186337+theunlocked@users.noreply.github.com> Date: Fri, 7 Nov 2025 10:26:04 +0100 Subject: [PATCH 39/82] Improve WebView multi-window UX (#2662) - Navigation history for lower windows is preserved when a popup is opened - Back gesture will close a popup window rather than the entire WebView activity when there is no previous page - The leftmost close button closes the entire activity as before - When a popup window is shown, a new button appears to close just that window (cherry picked from commit 855eea2ada8c09404dee99a965325913b246618f) --- .../webview/WebViewScreenContent.kt | 56 +++++++++++++------ .../main/res/drawable/ic_tab_close_24px.xml | 10 ++++ .../moko-resources/base/strings.xml | 1 + 3 files changed, 49 insertions(+), 18 deletions(-) create mode 100644 app/src/main/res/drawable/ic_tab_close_24px.xml diff --git a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt index 7c1751f6b5..af0f238919 100644 --- a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt +++ b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt @@ -5,6 +5,7 @@ import android.graphics.Bitmap import android.os.Message import android.webkit.WebResourceRequest import android.webkit.WebView +import androidx.activity.compose.BackHandler import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -28,7 +29,9 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.stack.mutableStateStackOf import com.kevinnzou.web.AccompanistWebChromeClient @@ -36,12 +39,13 @@ import com.kevinnzou.web.AccompanistWebViewClient import com.kevinnzou.web.LoadingState import com.kevinnzou.web.WebContent import com.kevinnzou.web.WebView +import com.kevinnzou.web.WebViewNavigator import com.kevinnzou.web.WebViewState -import com.kevinnzou.web.rememberWebViewNavigator import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.WarningBanner import eu.kanade.tachiyomi.BuildConfig +import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.getHtml import eu.kanade.tachiyomi.util.system.setDefaultSettings import kotlinx.collections.immutable.persistentListOf @@ -50,13 +54,13 @@ import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource -class WebViewWindow(webContent: WebContent) { +class WebViewWindow(webContent: WebContent, val navigator: WebViewNavigator) { var state by mutableStateOf(WebViewState(webContent)) var popupMessage: Message? = null private set var webView: WebView? = null - constructor(popupMessage: Message) : this(WebContent.NavigatorOnly) { + constructor(popupMessage: Message, navigator: WebViewNavigator) : this(WebContent.NavigatorOnly, navigator) { this.popupMessage = popupMessage } } @@ -72,27 +76,20 @@ fun WebViewScreenContent( headers: Map = emptyMap(), onUrlChange: (String) -> Unit = {}, ) { + val coroutineScope = rememberCoroutineScope() + val windowStack = remember { mutableStateStackOf( WebViewWindow( WebContent.Url(url = url, additionalHttpHeaders = headers), + WebViewNavigator(coroutineScope), ), ) } val currentWindow = windowStack.lastItemOrNull!! + val navigator = currentWindow.navigator - val popState: (() -> Unit) = remember { - { - if (windowStack.size == 1) { - onNavigateUp() - } else { - windowStack.pop() - } - } - } - - val navigator = rememberWebViewNavigator() val uriHandler = LocalUriHandler.current val scope = rememberCoroutineScope() @@ -161,7 +158,7 @@ fun WebViewScreenContent( ): Boolean { // if it wasn't initiated by a user gesture, we should ignore it like a normal browser would if (isUserGesture) { - windowStack.push(WebViewWindow(resultMsg)) + windowStack.push(WebViewWindow(resultMsg, WebViewNavigator(coroutineScope))) return true } return false @@ -176,6 +173,18 @@ fun WebViewScreenContent( return webView } + val popState = remember<() -> Unit> { + { + if (windowStack.size == 1) { + onNavigateUp() + } else { + windowStack.pop() + } + } + } + + BackHandler(windowStack.size > 1, popState) + Scaffold( topBar = { Box { @@ -183,7 +192,7 @@ fun WebViewScreenContent( AppBar( title = currentWindow.state.pageTitle ?: initialTitle, subtitle = currentUrl, - navigateUp = popState, + navigateUp = onNavigateUp, navigationIcon = Icons.Outlined.Close, actions = { AppBarActions( @@ -224,7 +233,18 @@ fun WebViewScreenContent( title = stringResource(MR.strings.pref_clear_cookies), onClick = { onClearCookies(currentUrl) }, ), - ), + ).builder().apply { + if (windowStack.size > 1) { + add( + 0, + AppBar.Action( + title = stringResource(MR.strings.action_webview_close_tab), + icon = ImageVector.vectorResource(R.drawable.ic_tab_close_24px), + onClick = popState, + ), + ) + } + }.build(), ) }, ) @@ -297,7 +317,7 @@ fun WebViewScreenContent( // The composable is being disposed but the WebView object is not. // When the WebView element is recomposed, we will want the WebView to resume from its state // before it was unmounted, we won't want it to reset back to its original target. - window.state = WebViewState(WebContent.NavigatorOnly) + window.state.content = WebContent.NavigatorOnly } }, client = webClient, diff --git a/app/src/main/res/drawable/ic_tab_close_24px.xml b/app/src/main/res/drawable/ic_tab_close_24px.xml new file mode 100644 index 0000000000..e14d35158c --- /dev/null +++ b/app/src/main/res/drawable/ic_tab_close_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index 6769184e93..6092636a07 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -163,6 +163,7 @@ Back Forward Refresh + Close tab Start downloading now Not now Add anyway From 79bdd60ab4ccc4887f28b09ec318dbdaceb37e60 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Fri, 7 Nov 2025 14:03:52 +0100 Subject: [PATCH 40/82] Translations update from Hosted Weblate (#2656) Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/cs/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/cs/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/de/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ja/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/jv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ru/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/zh_Hant/ Translation: Mihon/Mihon Translation: Mihon/Mihon Plurals Co-authored-by: Doministo Co-authored-by: Lyfja <45209212+lyfja@users.noreply.github.com> Co-authored-by: Nataniel Dika Kurniawan Co-authored-by: TheKingTermux <50316075+TheKingTermux@users.noreply.github.com> Co-authored-by: ZerOriSama Co-authored-by: amigo browser (cherry picked from commit f7fb68692a7c41f9f09721dde8db574df1fde1ce) --- .../commonMain/moko-resources/cs/plurals.xml | 18 +++++++++++++++ .../commonMain/moko-resources/cs/strings.xml | 17 +++++++++----- .../commonMain/moko-resources/de/strings.xml | 3 +++ .../commonMain/moko-resources/ja/strings.xml | 19 +++++++++++----- .../commonMain/moko-resources/jv/strings.xml | 22 +++++++++++++++++++ .../commonMain/moko-resources/ru/strings.xml | 1 + .../moko-resources/zh-rCN/strings.xml | 7 +++++- .../moko-resources/zh-rTW/strings.xml | 3 +++ 8 files changed, 79 insertions(+), 11 deletions(-) diff --git a/i18n/src/commonMain/moko-resources/cs/plurals.xml b/i18n/src/commonMain/moko-resources/cs/plurals.xml index 0c62f50cd3..a6398c3a93 100644 --- a/i18n/src/commonMain/moko-resources/cs/plurals.xml +++ b/i18n/src/commonMain/moko-resources/cs/plurals.xml @@ -95,4 +95,22 @@ %1$s stránky %1$s stránek + + Migrovat %1$d položku? + Migrovat %1$d položky? + Migrovat %1$d položek? + Migrovat %1$d položek? + + + Zkopírovat %1$d položku? + Zkopírovat %1$d položky? + Zkopírovat %1$d položkek? + Zkopírovat %1$d položkek? + + + Položka byla přeskočena + %1$d položky byly přeskočeny + %1$d položek bylo přeskočeno + %1$d položek bylo přeskočeno + diff --git a/i18n/src/commonMain/moko-resources/cs/strings.xml b/i18n/src/commonMain/moko-resources/cs/strings.xml index 6bf70298db..43d7839eda 100644 --- a/i18n/src/commonMain/moko-resources/cs/strings.xml +++ b/i18n/src/commonMain/moko-resources/cs/strings.xml @@ -540,7 +540,7 @@ Každé 3 dny Jen na Wi-Fi Podrobné protokolování - Varování: hromadné stahování může vést k tomu, že zdroje zpomalí a/nebo zablokují Mihon. Klepnutím se dozvíte více. + Varování: hromadné stahování může vést k tomu, že zdroje zpomalí a/nebo zablokují %s. Klepnutím se dozvíte více. Aktualizovat vše Vypisovat podrobné informace do systémového protokolu (sníží výkon aplikace) Aktualizace aplikace @@ -687,8 +687,8 @@ Překlopení orientace otočených širokých stránek Otočení širokých stránek tak, aby se vešly Ladící informace - Přejetí prstem doprava - Přejetí prstem doleva + Kapitola po přejetí doprava + Kapitola po přejetí doleva Přiblížení dvojitým klepnutím Přizpůsobený interval aktualizace Další očekávaná aktualizace @@ -768,7 +768,7 @@ \nVybraná složka: %2$s Úplná chyba: Chytrá aktualizace - Přidat další repozitáře do Mihon. Měli by to být URL končící \"index.min.json\". + Přidat další repozitáře do %s. Měli by to být URL končící \"index.min.json\". Tento repozitář již existuje! Odstranit repozitář Neplatná URL repozitáře @@ -833,7 +833,7 @@ Následující měsíc Návod k nadcházejícím kapitolám Automaticky - Označit duplicitní přečtené kapitoly jako přečtené + Označit duplicitní přečtenou kapitolu jako přečtenou Černobílý Autor Umělec @@ -860,4 +860,11 @@ Nepodařilo se vytvořit adresář: %s Chystáte se odstranit položky z databáze Ponechat položky s přečtenými kapitolami + Přispěj + Catppuccin + Skrýt indikátory chybějících kapitol + Nepovolovat soubory s non-ASCII znaky + Zajišťuje kompatibilitu s určitými úložnými médii, která nepodporují Unicode. Pokud je tato funkce povolena, budete muset ručně přejmenovat názvy složkek source a manga tak, že nahradíte non-ASCII znaky jejich malými hexadecimálními znaky v UTF-8. Názvy souborů kapitol není nutné přejmenovávat. + Souběžné stahování zdrojů + Souběžné stahování stránek diff --git a/i18n/src/commonMain/moko-resources/de/strings.xml b/i18n/src/commonMain/moko-resources/de/strings.xml index 638c6a9b3e..998ccccfb8 100644 --- a/i18n/src/commonMain/moko-resources/de/strings.xml +++ b/i18n/src/commonMain/moko-resources/de/strings.xml @@ -905,4 +905,7 @@ Bilder in Mangabeschreibungen anzeigen Nicht-ASCII-Dateinamen nicht zulassen Versichert Kompatibilität mit bestimmten Speichermedien, die Unicode nicht unterstützen. Ist diese Option aktiviert, müssen Quellen- und Manga-Ordner manuell umbenannt werden, indem Nicht-ASCII-Zeichen durch ihre UTF-8-Hexadezimaldarstellungen in Kleinbuchstaben ersetzt werden. Kapiteldateien müssen nicht umbenannt werden. + Gleichzeitige Quellendownloads + Gleichzeitige Seitendownloads + Pro Quelle gleichzeitig heruntergeladene Seiten diff --git a/i18n/src/commonMain/moko-resources/ja/strings.xml b/i18n/src/commonMain/moko-resources/ja/strings.xml index 6769c89ffd..4427038e39 100644 --- a/i18n/src/commonMain/moko-resources/ja/strings.xml +++ b/i18n/src/commonMain/moko-resources/ja/strings.xml @@ -540,7 +540,7 @@ 言語 警告 Verboseログ出力 - 警告: 大量の一括ダウンロードにより、ソースは遅くなったり、Mihonを接続禁止したりする恐れがあります。詳しくはタップでご覧ください。 + 警告:大量のダウンロードは、ソースの速度低下や %s のブロックにつながる可能性があります。詳細を確認するにはタップしてください。 3日ごと Wi-Fi接続時のみ 全て更新 @@ -838,20 +838,20 @@ 行動 章の読了後 ライブラリーのマンガのタイトルをソースに合わせて更新 - 拡張機能の既読章履歴を一時停止 + 拡張機能の閲覧履歴を一時停止 ログイン中… 重複する既読章を既読としてマークする 新章取得後 - ライブラリに名前が似ている作品があります。\n\n移行作品の選択、またはそのまま追加。 + ライブラリに類似した名前のエントリが存在します。\n\n移行するエントリを選択するか、そのまま追加してください。 著者 アーティスト 未読の章 ダウンロードディレクトリの作成に失敗しました ディレクトリの作成に失敗しました: %s データベースから作品が削除されます - ライブラリ外作品の既読の章と進捗は失われます + 非図書館エントリの章の読み取りと進捗は失われます 読み終えた章を含むエントリーを保持する - 重複の可能性あり + 重複の可能性 寄付する 自動車 キャットプッチン @@ -860,4 +860,13 @@ 欠落している章のインジケーターを非表示にする レガシーデコーダーを長尺ストリップリーダーに使用する ライブラリーリスト + 非ASCIIファイル名を許可しない + 特定のUnicode非対応ストレージメディアとの互換性を確保します。有効にした場合、ソースフォルダとマンガフォルダは手動で名前を変更する必要があります。非ASCII文字を小文字のUTF-8 16進数表記に置き換えてください。チャプターファイルの名前変更は不要です。 + 同時ソースダウンロード + 同時ページダウンロード + ソースごとの同時ダウンロードページ数 + 警告:マンガのタイトルが変更された場合、ダウンロードキューから削除されます(存在する場合)。 + 非公開で追跡 + 非公開で追跡する + 公開で追跡する diff --git a/i18n/src/commonMain/moko-resources/jv/strings.xml b/i18n/src/commonMain/moko-resources/jv/strings.xml index 8a4ca343c2..8bb0d7e209 100644 --- a/i18n/src/commonMain/moko-resources/jv/strings.xml +++ b/i18n/src/commonMain/moko-resources/jv/strings.xml @@ -316,4 +316,26 @@ nganyari kang diarep-arep sabanjure Skor pelacak mawut + Mbaharui kategori + Bikak entri acak + Busek sedaya + Santun dhateng blabak klip + Santun link + Bab durung diwaca + Tombol lajengaken maos + Terapaken + OK + Pindhah seri ka ngisor + Cathetan + Ganti cathetan + Mbalikake marang default + Ora saiki + Tambahaken mawon + Panuntun wiwitan + Sugeng rawuh! + Ayo awakdewe atur sawetara perkara ndhisik. Sampeyan uga mesthi isa ngowahi ing menu setelan mengko. + Terusane + Rampung + Nglangkungi + Milih direktori kanggo nyimpen isi saka %1$s, kalebu unduhan bab, data backup, lan liya-liyane. \n \nApike kudu nganggo direktori kapisah. \n \ndirektori ingkang dipunpilih: %2$s diff --git a/i18n/src/commonMain/moko-resources/ru/strings.xml b/i18n/src/commonMain/moko-resources/ru/strings.xml index 2082de1ed4..176d06479d 100644 --- a/i18n/src/commonMain/moko-resources/ru/strings.xml +++ b/i18n/src/commonMain/moko-resources/ru/strings.xml @@ -905,4 +905,5 @@ Спонсорство Не позволять наименования файлов в виде non-ASCII Обеспечивает совместимость с некоторыми носителями информации, которые не поддерживают Unicode. Когда этот функция включена, вам нужно будет вручную переименовать папки серий и источников, заменив non-ASCII символы на шестнадцатеричные UTF-8 в нижнем регистре. Файлы глав можно не переименовать. + Параллельные загрузки с источников diff --git a/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml b/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml index c932f9cf59..074df20c95 100644 --- a/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml +++ b/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml @@ -859,7 +859,7 @@ 创建下载目录失败 创建目录失败: %s 正在登录… - 更新书架中的漫画标题以匹配来源 + 更新书架中的漫画标题以匹配图源 警告:如果漫画被重命名,将会从下载队列中移除(如果存在)。 选中 全不选 @@ -903,4 +903,9 @@ 隐藏缺失章节提示符 在漫画注释中显示图片 捐赠 + 禁用非ASCII文件名 + 确保与某些不支持 Unicode 的存储介质相兼容。启用此功能后,你需要手动重命名图源和漫画文件夹,将非 ASCII 字符改为对应的 UTF-8 小写十六进制表示形式。章节文件无需重命名。 + 同时下载的图源数量 + 同时下载的页数 + 每个图源同时下载的页数 diff --git a/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml b/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml index 3f69ffbdda..595af13620 100644 --- a/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml +++ b/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml @@ -896,4 +896,7 @@ 捐贈 禁止使用非 ASCII 檔名 確保與不支援 Unicode 的某些儲存媒體相容,啟用此選項後,你需要手動將來源與漫畫資料夾中的非 ASCII 字元改成對應的小寫 UTF-8 十六進位表示方式,章節檔案則不需要重新命名。 + 同時下載的來源數目 + 同時下載的頁數 + 每個來源同時下載的頁數 From f5dff77398881ecbff742fa47ad1c17e5b1910cf Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Tue, 11 Nov 2025 09:27:44 +0100 Subject: [PATCH 41/82] Translations update from Hosted Weblate (#2676) Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/it/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/am/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ar/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/as/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/bg/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/bn/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ca/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ceb/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/cv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/da/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/de/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/el/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/es/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/eu/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/fa/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/fi/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/gl/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/he/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/hr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/hu/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/it/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/kk/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/kn/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/lt/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/lv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ms/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ne/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/nn/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/pl/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/pt/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sa/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sah/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sc/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sk/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sq/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/th/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/tr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/uk/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/zh_Hant/ Translation: Mihon/Mihon Translation: Mihon/Mihon Plurals Co-authored-by: FateXBlood Co-authored-by: Frosted Co-authored-by: Gino Cicatiello Co-authored-by: Lyfja <45209212+lyfja@users.noreply.github.com> Co-authored-by: MajorTanya Co-authored-by: Milo Ivir Co-authored-by: NGB-Was-Taken <76197326+NGB-Was-Taken@users.noreply.github.com> Co-authored-by: NGB-Was-Taken Co-authored-by: Pitpe11 Co-authored-by: Swyter Co-authored-by: ZerOriSama (cherry picked from commit 84d620978bbc5a4698787f5ab81686e7e60767c9) --- .../commonMain/moko-resources/am/strings.xml | 2 +- .../commonMain/moko-resources/ar/strings.xml | 4 ++-- .../commonMain/moko-resources/as/strings.xml | 4 ++-- .../commonMain/moko-resources/bg/strings.xml | 6 ++--- .../commonMain/moko-resources/bn/strings.xml | 4 ++-- .../commonMain/moko-resources/ca/strings.xml | 4 ++-- .../commonMain/moko-resources/ceb/strings.xml | 2 +- .../commonMain/moko-resources/cv/strings.xml | 2 +- .../commonMain/moko-resources/da/strings.xml | 2 +- .../commonMain/moko-resources/de/strings.xml | 1 + .../commonMain/moko-resources/el/strings.xml | 4 ++++ .../commonMain/moko-resources/es/strings.xml | 1 + .../commonMain/moko-resources/eu/strings.xml | 4 ++-- .../commonMain/moko-resources/fa/strings.xml | 6 ++--- .../commonMain/moko-resources/fi/strings.xml | 8 +++---- .../commonMain/moko-resources/gl/strings.xml | 4 ++-- .../commonMain/moko-resources/he/strings.xml | 4 ++-- .../commonMain/moko-resources/hr/strings.xml | 1 + .../commonMain/moko-resources/hu/strings.xml | 4 ++-- .../commonMain/moko-resources/it/plurals.xml | 7 +++++- .../commonMain/moko-resources/it/strings.xml | 4 ++-- .../commonMain/moko-resources/kk/strings.xml | 4 ++-- .../commonMain/moko-resources/kn/strings.xml | 2 +- .../commonMain/moko-resources/lt/strings.xml | 4 ++-- .../commonMain/moko-resources/lv/strings.xml | 4 ++-- .../commonMain/moko-resources/ms/strings.xml | 2 +- .../moko-resources/nb-rNO/strings.xml | 6 ++--- .../commonMain/moko-resources/ne/strings.xml | 23 ++++++++++--------- .../commonMain/moko-resources/nn/strings.xml | 2 +- .../commonMain/moko-resources/pl/strings.xml | 2 +- .../moko-resources/pt-rBR/strings.xml | 6 ++--- .../commonMain/moko-resources/pt/strings.xml | 6 ++--- .../commonMain/moko-resources/sa/strings.xml | 4 ++-- .../commonMain/moko-resources/sah/strings.xml | 2 +- .../commonMain/moko-resources/sc/strings.xml | 4 ++-- .../commonMain/moko-resources/sk/strings.xml | 4 ++-- .../commonMain/moko-resources/sq/strings.xml | 4 ++-- .../commonMain/moko-resources/sr/strings.xml | 6 ++--- .../commonMain/moko-resources/sv/strings.xml | 4 ++-- .../commonMain/moko-resources/th/strings.xml | 4 ++-- .../commonMain/moko-resources/tr/strings.xml | 1 + .../commonMain/moko-resources/uk/strings.xml | 4 ++-- .../moko-resources/zh-rCN/strings.xml | 1 + .../moko-resources/zh-rTW/strings.xml | 1 + 44 files changed, 97 insertions(+), 81 deletions(-) diff --git a/i18n/src/commonMain/moko-resources/am/strings.xml b/i18n/src/commonMain/moko-resources/am/strings.xml index c895c237d0..31da6eaf82 100644 --- a/i18n/src/commonMain/moko-resources/am/strings.xml +++ b/i18n/src/commonMain/moko-resources/am/strings.xml @@ -270,7 +270,7 @@ ምትኬን መፍጠር ምትኬ ለማስቀመጥ ምን ይፈልጋሉ? ምትኬ ቀድሞውኑ በሂደት ላይ ነው - %02d ደቂቃ ፣ %02d ሰከንድ + %1$02d ደቂቃ ፣ %2$02d ሰከንድ እነበረበት መልስ ተጠናቅቋል መከታተያዎች አልገቡም: የጠፋ ምንጮች: diff --git a/i18n/src/commonMain/moko-resources/ar/strings.xml b/i18n/src/commonMain/moko-resources/ar/strings.xml index 4dba0dfe8d..fe0fca5e27 100644 --- a/i18n/src/commonMain/moko-resources/ar/strings.xml +++ b/i18n/src/commonMain/moko-resources/ar/strings.xml @@ -555,7 +555,7 @@ %1$d مدخلةً في قاعدة البيانات وليست في المكتبة فشل الحصول على قائمة الملحقات ثبِّت «شيزوكو» وشغِّله لتستخدمه مثبِّت إضافات. - %sتحذير: يمكن أن تؤدِّي التنزيلات كبيرة الحجم والعدد إلى إبطاء المصادر، وقد يُحظر %s منها بسبب ذلك. اضغط لمعرفة المزيد۔ + تحذير: يمكن أن تؤدِّي التنزيلات كبيرة الحجم والعدد إلى إبطاء المصادر، وقد يُحظر %s منها بسبب ذلك. اضغط لمعرفة المزيد۔ إظهار الدخول شبكة بالاغلفة تُخُطِّيت بسبب عدم وجود فصول قُرئت @@ -766,7 +766,7 @@ إبطال الإضافات غير الموثوق بها مستودع الإضافات رابط المستودع - إضافة مستودعات إضافية إلى ميهون. يجب أن يكون هذا الرابط ينتهي بـ \"index.min.json\". + إضافة مستودعات إضافية إلى %s. يجب أن يكون هذا الرابط ينتهي بـ \"index.min.json\". هذا المستودع موجود بالفعل! حذف المستودع رابط المستودع غير صالح diff --git a/i18n/src/commonMain/moko-resources/as/strings.xml b/i18n/src/commonMain/moko-resources/as/strings.xml index 04bffcb25d..616f0ea2f4 100644 --- a/i18n/src/commonMain/moko-resources/as/strings.xml +++ b/i18n/src/commonMain/moko-resources/as/strings.xml @@ -328,7 +328,7 @@ Shizuku ইন্সটল কৰক আৰু আৰম্ভ কৰক Shizuku এক্সটেনচন ইন্সটলাৰ হিচাপে ব্যৱহাৰ কৰিবলৈ। ৰেপো যোগ কৰক ৰেপো URL - Mihon-ত অতিৰিক্ত ৰেপো যোগ কৰক। এইটো এনেকুৱা এটা URL হ\'ব লাগিব যাৰ শেষত index.min.json থাকে। + %s-ত অতিৰিক্ত ৰেপো যোগ কৰক। এইটো এনেকুৱা এটা URL হ\'ব লাগিব যাৰ শেষত index.min.json থাকে। ৰেপো মচক অবৈধ ৰেপো URL আপুনি কি ৰেপো %s মচিব বিচাৰে? @@ -748,7 +748,7 @@ %ds অধ্যায়সমূহ ডাউনলোড কৰিবলৈ সক্ষম নহ\'ল। আপুনি ডাউনলোডৰ অংশত পুনৰ চেষ্টা কৰিব পাৰে পৰ্যাপ্ত স্থান নাথাকাৰ বাবে অধ্যায়সমূহ ডাউনলোড কৰিবলৈ সক্ষম নহ\'ল - সতৰ্কতা: ডাঙৰ বাল্ক ডাউনলোডে মূলে ধীৰগতিত পৰিণত কৰিব পাৰে আৰু/অথবা Mihon ব্লক কৰিব পাৰে। অধিক জানিবলৈ টেপ কৰক। + সতৰ্কতা: ডাঙৰ বাল্ক ডাউনলোডে মূলে ধীৰগতিত পৰিণত কৰিব পাৰে আৰু/অথবা %s ব্লক কৰিব পাৰে। অধিক জানিবলৈ টেপ কৰক। লাইব্রেৰী আপডেট হৈ আছে… (%s) ডাঙৰ আপডেটসমূহে মূলে ক্ষতি কৰে আৰু ধীৰ গতিত আপডেট হব পাৰে আৰু বেটাৰী ব্যৱহাৰ বৃদ্ধি পাব পাৰে। অধিক জানিবলৈ টেপ কৰক। নতুন অধ্যায় পোৱা গৈছে diff --git a/i18n/src/commonMain/moko-resources/bg/strings.xml b/i18n/src/commonMain/moko-resources/bg/strings.xml index ec41adb314..3208bc2350 100644 --- a/i18n/src/commonMain/moko-resources/bg/strings.xml +++ b/i18n/src/commonMain/moko-resources/bg/strings.xml @@ -328,7 +328,7 @@ Възстановяването е в процес Съхраняването неуспешно Архивирането вече е в ход - %02d мин, %02d сек + %1$02d мин, %2$02d сек Странично разстояние Четене Винаги показвай прехода между главите @@ -554,7 +554,7 @@ Неуспешно получаване на списък с разширения На всеки 3 дена Само през Wi-Fi - Предупреждение: големите масови изтегляния могат да доведат до забавяне на източниците и/или блокиране на Mihon. Натиснете тук, за да научите повече. + Предупреждение: големите масови изтегляния могат да доведат до забавяне на източниците и/или блокиране на %s. Натиснете тук, за да научите повече. Покажи манга Решетка само с корици Искате ли да изтриете категорията \"%s\"? @@ -573,7 +573,7 @@ Популярни Списък с незавършени %s се сблъска с неочаквана грешка. Препоръчваме да заснемете това съобщение, да запазите записите от крашовете и да ги споделите в нашия канал за поддръжка в Discord. - Последно обновяване на библиотеката: %1$s + Последно обновяване на библиотеката: %s Списък за четене Не може да се отвори последната прочетена глава Не беше намерен източник diff --git a/i18n/src/commonMain/moko-resources/bn/strings.xml b/i18n/src/commonMain/moko-resources/bn/strings.xml index 5f4ca3a9b8..8215a047f0 100644 --- a/i18n/src/commonMain/moko-resources/bn/strings.xml +++ b/i18n/src/commonMain/moko-resources/bn/strings.xml @@ -345,7 +345,7 @@ বর্তমানে পুনরুদ্ধার চলছে ব্যাকআপ ব্যর্থ হয়েছে ব্যাকআপ ইতিমধ্যেই চলছে - %02d মিনিট, %02d সেকেন্ড + %1$02d মিনিট, %2$02d সেকেন্ড উৎস অনুপলব্ধ: ব্যাকআপে কোনো মাংগা নেই। ব্যাকআপ ফাইল গ্রহণযোগ্য নয় @@ -548,7 +548,7 @@ প্রতি ৩ দিন সুধু মাত্র ওয়িফি তে সতর্কতা: বড় আপডেটগুলি উত্সের ক্ষতি করে এবং ধীরগতির আপডেটের দিকে নিয়ে যেতে পারে এবং ব্যাটারি ব্যবহারও বাড়িয়ে দিতে পারে - সতর্কতা: বড় আকারের ডাউনলোডের ফলে উৎসগুলি মন্থর হয়ে যেতে পারে এবং/অথবা তাচিওমি ব্লক হয়ে যেতে পারে। আরও জানতে এখানে ট্যাপ করুন। + সতর্কতা: বড় আকারের ডাউনলোডের ফলে উৎসগুলি মন্থর হয়ে যেতে পারে এবং/অথবা %s ব্লক হয়ে যেতে পারে। আরও জানতে এখানে ট্যাপ করুন। অ্যাপ বন্দ্ধ করার সময় অধ্যায়ের ক্যাশে পরিষ্কার করুন তথ্যশালা পরিষ্কার তথ্যশালায় %1$d টি মাঙ্গা যেগুলি লাইব্রেরীতে নেই diff --git a/i18n/src/commonMain/moko-resources/ca/strings.xml b/i18n/src/commonMain/moko-resources/ca/strings.xml index 14cab030e6..1124631a0f 100644 --- a/i18n/src/commonMain/moko-resources/ca/strings.xml +++ b/i18n/src/commonMain/moko-resources/ca/strings.xml @@ -551,7 +551,7 @@ Actualitzacions de l’aplicació Segueix Informació de l’aplicació - Advertència: Les baixades massa grosses poden fer que les fonts es tornin més lentes i/o bloquin el Mihon. Premeu per a obtenir-ne més informació. + Advertència: Les baixades massa grosses poden fer que les fonts es tornin més lentes i/o bloquin el %s. Premeu per a obtenir-ne més informació. Les actualitzacions grosses perjudiquen les fonts i poden implicar actualitzacions més lentes i un augment en l’ús de bateria. Premeu per a obtenir-ne més informació. Amplia automàticament les imatges amples Mostra l’element @@ -763,7 +763,7 @@ Repositoris d’extensions No heu definit cap repositori. Suprimeix el repositori - Afegiu repositoris addicionals al Mihon. Ha de ser un URL que acabi amb «index.min.json». + Afegiu repositoris addicionals al %s. Ha de ser un URL que acabi amb «index.min.json». Aquest repositori ja existeix! URL del repositori invàlid Voleu suprimir el repositori «%s»? diff --git a/i18n/src/commonMain/moko-resources/ceb/strings.xml b/i18n/src/commonMain/moko-resources/ceb/strings.xml index 366756d11a..c79f8f0e60 100644 --- a/i18n/src/commonMain/moko-resources/ceb/strings.xml +++ b/i18n/src/commonMain/moko-resources/ceb/strings.xml @@ -357,7 +357,7 @@ DNS sa HTTPS (DoH) Nagkinahanglan nga i-restart ang app aron ma-epekto Ang pag-backup nagpadayon na - %02d minuto , %02d ikaduha + %1$02d minuto , %2$02d ikaduha Unsa ang gusto nimo i-backup? Ang datos gikan sa backup file mapasig-uli. \n diff --git a/i18n/src/commonMain/moko-resources/cv/strings.xml b/i18n/src/commonMain/moko-resources/cv/strings.xml index b6e1ee72c7..20caa2115c 100644 --- a/i18n/src/commonMain/moko-resources/cv/strings.xml +++ b/i18n/src/commonMain/moko-resources/cv/strings.xml @@ -625,7 +625,7 @@ Пӗр хушмасен ҫӳпҫи те ҫук. Хушмасен ҫӳпҫи хуш Хушмасен ҫӳпҫин URL-ӗ - Mihon-а хушма хушмасен ҫӳпҫи хуш. «index.min.json» тенипе вӗҫленекен URL пулмалла. + %s-а хушма хушмасен ҫӳпҫи хуш. «index.min.json» тенипе вӗҫленекен URL пулмалла. Ку хушмасен ҫӳпҫи унсӑрах пур! Хушмасен ҫӳпҫине катерт Хушмасен ҫӳпҫин йӑнӑш URL-ӗ diff --git a/i18n/src/commonMain/moko-resources/da/strings.xml b/i18n/src/commonMain/moko-resources/da/strings.xml index 48493fc824..7ac134587b 100644 --- a/i18n/src/commonMain/moko-resources/da/strings.xml +++ b/i18n/src/commonMain/moko-resources/da/strings.xml @@ -301,7 +301,7 @@ Opdel høje billeder Deaktiveret Senest læste kapitel - %02d min, %02d sek + %1$02d min, %2$02d sek Høj Gendan biblioteket fra sikkerhedskopi Forrige side diff --git a/i18n/src/commonMain/moko-resources/de/strings.xml b/i18n/src/commonMain/moko-resources/de/strings.xml index 998ccccfb8..ecc149c1b6 100644 --- a/i18n/src/commonMain/moko-resources/de/strings.xml +++ b/i18n/src/commonMain/moko-resources/de/strings.xml @@ -908,4 +908,5 @@ Gleichzeitige Quellendownloads Gleichzeitige Seitendownloads Pro Quelle gleichzeitig heruntergeladene Seiten + Tab schließen diff --git a/i18n/src/commonMain/moko-resources/el/strings.xml b/i18n/src/commonMain/moko-resources/el/strings.xml index 0288ea8de2..f9e7f86a82 100644 --- a/i18n/src/commonMain/moko-resources/el/strings.xml +++ b/i18n/src/commonMain/moko-resources/el/strings.xml @@ -905,4 +905,8 @@ Αναπαράσταση εικόνων σε περιγραφές manga Απαγόρευση μη ASCII ονομάτων αρχείων Εξασφαλίζει συμβατότητα με ορισμένα μέσα αποθήκευσης που δεν υποστηρίζουν Unicode. Όταν αυτή η επιλογή είναι ενεργοποιημένη, θα πρέπει να μετονομάσετε χειροκίνητα τους φακέλους πηγής και manga, αντικαθιστώντας τους χαρακτήρες που δεν είναι ASCII με τις μικρές κεφαλαίες δεκαεξαδικές αναπαραστάσεις UTF-8. Τα αρχεία κεφαλαίων δε χρειάζεται να μετονομάζονται. + Κλείσιμο καρτέλας + Ταυτόχρονες λήψεις πηγών + Ταυτόχρονες λήψεις σελίδων + Σελίδες που λήφθηκαν ταυτόχρονα ανά πηγή diff --git a/i18n/src/commonMain/moko-resources/es/strings.xml b/i18n/src/commonMain/moko-resources/es/strings.xml index 4a0688b1c3..e9db721953 100644 --- a/i18n/src/commonMain/moko-resources/es/strings.xml +++ b/i18n/src/commonMain/moko-resources/es/strings.xml @@ -901,4 +901,5 @@ Descarga simultánea desde fuentes Descarga simultánea de páginas Cantidad de páginas a descargar simultáneamente desde cada fuente remota + Cerrar pestaña diff --git a/i18n/src/commonMain/moko-resources/eu/strings.xml b/i18n/src/commonMain/moko-resources/eu/strings.xml index ac93d1a3e5..9951193e9a 100644 --- a/i18n/src/commonMain/moko-resources/eu/strings.xml +++ b/i18n/src/commonMain/moko-resources/eu/strings.xml @@ -33,9 +33,9 @@ Iturri lokala Azkenak Ez dago emaitza gehiagorik - Abisua: deskarga handiek iturriak motelagoak izatea eta/edo Mihon blokeatzea ekar dezakete + Abisua: deskarga handiek iturriak motelagoak izatea eta/edo %s blokeatzea ekar dezakete. Babeskopia sortzen - %02d min, %02d seg + %1$02d min, %2$02d seg Gehitu jarraipena Errore bat gertatu da cachea garbitzean Babeskopia sortu da diff --git a/i18n/src/commonMain/moko-resources/fa/strings.xml b/i18n/src/commonMain/moko-resources/fa/strings.xml index 7514a78a3d..9baa5b38ba 100644 --- a/i18n/src/commonMain/moko-resources/fa/strings.xml +++ b/i18n/src/commonMain/moko-resources/fa/strings.xml @@ -343,7 +343,7 @@ درحال ایجاد نسخه پشتیبان چه چیزی را می خواهید پشتیبان گیری کنید ؟ پشتیبان گیری هنوز در حال انجام است - %02d دقیقه, %02d ثانیه + %1$02d دقیقه, %2$02d ثانیه بازیابی کامل شد منابع ناموجود: فایل پشتیبان حاوی هیچ ورودی کتابخانه نیست. @@ -598,7 +598,7 @@ داده های و ذخیره سازی باشه به روز رسانی مورد انتظار بعدی - هشدار: حجم زیاد بارگیری ممکن است باعث اهسته تر شدن سرعت ویا مسدود کردن Mihon از منبع شود. برای اطلاعات بیشتر لمس کنید. + هشدار: حجم زیاد بارگیری ممکن است باعث اهسته تر شدن سرعت ویا مسدود کردن %s از منبع شود. برای اطلاعات بیشتر لمس کنید. به دلیل این که این مجموعه نیازی به به روز رسانی نداشت رد شد به دلیل وجود چپتر های خوانده نشده رد شد به دلیل این که هیچ چپتری خوانده نشده بود رد شد @@ -643,7 +643,7 @@ شروع کنید پرش مجوز برای نصب افزونه ها لازم است. به اینجا ضربه بزنید تا اعطا کنید. - به میهون مخازن اضافی اضافه کنید. این باید یک آدرس باشد که با \"index.min.json\" تمام شود. + به %s مخازن اضافی اضافه کنید. این باید یک آدرس باشد که با \"index.min.json\" تمام شود. شما هیچ مخزنی برای تنظیم ندارید. مخزن منبع باز مقدار رد باقی مانده در نمایش گر های E-ink کاهش میابد diff --git a/i18n/src/commonMain/moko-resources/fi/strings.xml b/i18n/src/commonMain/moko-resources/fi/strings.xml index 8c3bc9cbf9..1e6e4acd60 100644 --- a/i18n/src/commonMain/moko-resources/fi/strings.xml +++ b/i18n/src/commonMain/moko-resources/fi/strings.xml @@ -357,7 +357,7 @@ Tarkista päivitykset Viimeksi käytetty Paikallinen lähdeopas - %02d min, %02d sek + %1$02d min, %2$02d sek Suodattaa kaikki sarjat kirjastossasi Harmaa Tälle sarjalle @@ -490,7 +490,7 @@ Pois päältä Päällä Aloitusopas - Varoitus: massalataukset voivat johtaa siihen, että lähteet muuttuvat hitaammiksi käyttää ja/tai ne estävät Mihonin käytön. Napauta saadaksesi lisätietoja. + Varoitus: massalataukset voivat johtaa siihen, että lähteet muuttuvat hitaammiksi käyttää ja/tai ne estävät %sin käytön. Napauta saadaksesi lisätietoja. Näytä manga Kansikuva ruudukko Dynaaminen @@ -570,7 +570,7 @@ Luetut Virhe tallentaessa kuvaa Kirjastoa ollaan jo päivitämässä - Kirjasto päivitetty viimeksi: %1$s + Kirjasto päivitetty viimeksi: %s %1$d päivitys(tä) epäonnistui Ohitettu, koska sarja on päättynyt Sinulla ei vielä ole kategorioita. @@ -648,7 +648,7 @@ Laajennosten asentamiseen tarvitaan lupia. Napauta tästä myöntääksesi luvat. Lisää laajennosten lähde Laajennosten lähteen URL - Lisää laajennosten lähteitä Mihoniin. URL-osoitteen tulisi päättyä \"index.min.json\". + Lisää laajennosten lähteitä %siin. URL-osoitteen tulisi päättyä \"index.min.json\". Tämä laajennosten lähde on jo lisättynä! Poista laajennosten lähde Epäkelpo laajennosten lähteen URL-osoite diff --git a/i18n/src/commonMain/moko-resources/gl/strings.xml b/i18n/src/commonMain/moko-resources/gl/strings.xml index 987f8628f5..b8ba879553 100644 --- a/i18n/src/commonMain/moko-resources/gl/strings.xml +++ b/i18n/src/commonMain/moko-resources/gl/strings.xml @@ -576,7 +576,7 @@ %s pechouse por un problema inesperado. Aconsellámoste que compartas os rexistros de erros na canle de soporte no Discord (en inglés). Reinicia a aplicación Non se atopou ninguna fonte instalada - Advertencia: As descargas pesadas poden facer que as fontes se volvan máis lentas e/ou bloqueen Mihon. Preme para saber máis. + Advertencia: As descargas pesadas poden facer que as fontes se volvan máis lentas e/ou bloqueen %s. Preme para saber máis. Abrir no GitHub Xestor de descargas Erro @@ -704,7 +704,7 @@ Marcas de tempo relativas Actualizacións intelixentes Engadir un repositorio - Engade máis repositorios a Mihon. Debe ser unha dirección URL que remate en \"index.min.json\". + Engade máis repositorios a %s. Debe ser unha dirección URL que remate en \"index.min.json\". Borrar repositorio A dirección URL do repositorio non é válida Queres eliminar o repositorio \"%s\"? diff --git a/i18n/src/commonMain/moko-resources/he/strings.xml b/i18n/src/commonMain/moko-resources/he/strings.xml index 9d978bceba..c46b983903 100644 --- a/i18n/src/commonMain/moko-resources/he/strings.xml +++ b/i18n/src/commonMain/moko-resources/he/strings.xml @@ -475,7 +475,7 @@ קריאה התחברות נעוץ - %02d דקות, %02d שניות + %1$02d דקות, %2$02d שניות השחזור בוטל רצוי לשמור עותקים נוספים של גיבויים במקומות אחרים בנוסף. אין מה לנקות @@ -539,7 +539,7 @@ אתה בטוח? כל ההיסטוריה תמחק. מדריך נדידת מקורות לא ניתן להוריד פרקים כי אין מספיק מקום אחסון - אזהרה: הורדות גדולות עלולות לגרום להאטה במקורות ו/או לחסימת Mihon. לחץ כדי ללמוד עוד. + אזהרה: הורדות גדולות עלולות לגרום להאטה במקורות ו/או לחסימת %s. לחץ כדי ללמוד עוד. פורמט פרק לא תקין בהפסקה האם תרצה למחוק את הקטגוריה %s? diff --git a/i18n/src/commonMain/moko-resources/hr/strings.xml b/i18n/src/commonMain/moko-resources/hr/strings.xml index 99faa7c39e..5d7bab635b 100644 --- a/i18n/src/commonMain/moko-resources/hr/strings.xml +++ b/i18n/src/commonMain/moko-resources/hr/strings.xml @@ -908,4 +908,5 @@ Istovremena preuzimanja izvora Istovremena preuzimanja stranica Istovremeno preuzete stranice po izvoru + Zatvori karticu diff --git a/i18n/src/commonMain/moko-resources/hu/strings.xml b/i18n/src/commonMain/moko-resources/hu/strings.xml index ce2dfbed6b..0f1f823e9d 100644 --- a/i18n/src/commonMain/moko-resources/hu/strings.xml +++ b/i18n/src/commonMain/moko-resources/hu/strings.xml @@ -499,7 +499,7 @@ Új fejezet Biztonsági mentés már folyamatban van Nincs telepítve - Figyelmeztetés: a tömeges letöltések a források lelassulásához és/vagy a Mihon leállásához vezethetnek. Koppintson további információért. + Figyelmeztetés: a tömeges letöltések a források lelassulásához és/vagy a %s leállásához vezethetnek. Koppintson további információért. Koppintson további információért Nem sikerült a fedlap frissítése Először adja az elemet a könyvtárhoz @@ -755,7 +755,7 @@ Nincsenek beállítva tárolók. Tároló felvétele Tároló URL - További tárolók hozzáadása a Mihonhoz. Ennek az URL-nek \"index.min.json\"-ra végződő URL-nek kell lennie. + További tárolók hozzáadása a %shoz. Ennek az URL-nek \"index.min.json\"-ra végződő URL-nek kell lennie. Ez a tároló már létezik! Tároló törlése Érvénytelen tároló URL diff --git a/i18n/src/commonMain/moko-resources/it/plurals.xml b/i18n/src/commonMain/moko-resources/it/plurals.xml index 0bf02d0017..df452a6942 100644 --- a/i18n/src/commonMain/moko-resources/it/plurals.xml +++ b/i18n/src/commonMain/moko-resources/it/plurals.xml @@ -95,4 +95,9 @@ %1$s pagine %1$s pagine - \ No newline at end of file + + Migrare %1$d voce? + Migrare %1$d voci? + Migrare %1$d voci? + + diff --git a/i18n/src/commonMain/moko-resources/it/strings.xml b/i18n/src/commonMain/moko-resources/it/strings.xml index f0ebc67eb0..5eab673cd6 100644 --- a/i18n/src/commonMain/moko-resources/it/strings.xml +++ b/i18n/src/commonMain/moko-resources/it/strings.xml @@ -542,7 +542,7 @@ Grossi aggiornamenti danneggiano le fonti, possono rallentare gli aggiornamenti e aumentare il consumo di batteria. Tocca per saperne di più. Solo su Wi-Fi Ogni 3 giorni - Attenzione: grossi download di massa possono rallentare le fonti e/o bloccare Mihon. Tocca per saperne di più. + Attenzione: grossi download di massa possono rallentare le fonti e/o bloccare %s. Tocca per saperne di più. Aggiorna tutto Aggiornamenti dell\'applicazione Cancella la cache capitoli all\'avvio dell\'app @@ -781,7 +781,7 @@ Aggiornamento intelligente Revoca le estensioni sconosciute affidabili Non hai repository impostate. - Aggiungi altri repository a Mihon. Questo dovrebbe essere un URL che termina con \"index.min.json\". + Aggiungi altri repository a %s. Questo dovrebbe essere un URL che termina con \"index.min.json\". Vuoi eleminare la repository \"%s\"? Errore completo: Si prevede che i nuovi capitoli saranno rilasciati tra circa %1$s, con controlli ogni %2$s. diff --git a/i18n/src/commonMain/moko-resources/kk/strings.xml b/i18n/src/commonMain/moko-resources/kk/strings.xml index 76beb3a6f1..0b9f99e821 100644 --- a/i18n/src/commonMain/moko-resources/kk/strings.xml +++ b/i18n/src/commonMain/moko-resources/kk/strings.xml @@ -306,7 +306,7 @@ Ж К Ақ - %02d мин, %02d сек + %1$02d мин, %2$02d сек Тараулардың ауысуын әрдайым көрсету Құлыпталған портрет Жоғары @@ -625,7 +625,7 @@ Жеке сүзгі Көп жаңалтулар саны дереккөздер жұмысын баяулата және батарея жұмысын өтімін көбейте алады. Көбірек білу үшін басыңыз. %1$s-Тарау - Ескерту: Көп жүктеулер саны дереккөздер жұмысын баяулата алады және/немесе Mihon бұғатталына алады. Толығырақ оқу үшін басыңыз. + Ескерту: Көп жүктеулер саны дереккөздер жұмысын баяулата алады және/немесе %s бұғатталына алады. Толығырақ оқу үшін басыңыз. Жаңа тараулар табылды Автоматты жүктеу, алдын ала жүктеу Көбірек diff --git a/i18n/src/commonMain/moko-resources/kn/strings.xml b/i18n/src/commonMain/moko-resources/kn/strings.xml index 5079661f81..2527addc2a 100644 --- a/i18n/src/commonMain/moko-resources/kn/strings.xml +++ b/i18n/src/commonMain/moko-resources/kn/strings.xml @@ -111,7 +111,7 @@ ಸಂಯೋಜನೆಗಳು ಇನ್ನಷ್ಟು ಹೆಸರು - %02d ನಿಮಿಷ, %02d ಸೆಕೆಂಡು + %1$02d ನಿಮಿಷ, %2$02d ಸೆಕೆಂಡು ಮರುಸ್ಥಾಪನೆ ಪೂರ್ಣಗೊಂಡಿದೆ ಬ್ಯಾಕಪ್ ರಚಿಸಲಾಗಿದೆ ಬ್ಯಾಕಪ್ ಆವರ್ತನ diff --git a/i18n/src/commonMain/moko-resources/lt/strings.xml b/i18n/src/commonMain/moko-resources/lt/strings.xml index b0b1e9f1e9..99bd76dd9c 100644 --- a/i18n/src/commonMain/moko-resources/lt/strings.xml +++ b/i18n/src/commonMain/moko-resources/lt/strings.xml @@ -477,10 +477,10 @@ Nėra „Wi-Fi“ ryšio Progresas Atsarginė kopija jau kuriama - Įspėjimas: dėl didelių masinių atsisiuntimų šaltiniai gali tapti lėtesni ir (arba) jie blokuoti \"Mihon\". Bakstelėkite , jei norite sužinoti daugiau. + Įspėjimas: dėl didelių masinių atsisiuntimų šaltiniai gali tapti lėtesni ir (arba) jie blokuoti \"%s\". Bakstelėkite , jei norite sužinoti daugiau. Išjungti akumuliatoriaus optimizavimą Atkūrimas baigtas - %02d min, %02d sek + %1$02d min, %2$02d sek Nėra ką išvalyti „WebView“ duomenys išvalyti Darbo pradžios vadovas diff --git a/i18n/src/commonMain/moko-resources/lv/strings.xml b/i18n/src/commonMain/moko-resources/lv/strings.xml index 938c61d29b..3af102ee96 100644 --- a/i18n/src/commonMain/moko-resources/lv/strings.xml +++ b/i18n/src/commonMain/moko-resources/lv/strings.xml @@ -79,7 +79,7 @@ Izveido dublējumu Ko vēlaties dublēt? Dublēšana jau notiek - %02d min, %02d sec + %1$02d min, %2$02d sec Atjaunošana pabeigta Trūkstošie avoti: Dublējumā nav neviena bibliotēkas ieraksta. @@ -509,7 +509,7 @@ Vai izmantot šo attēlu kā vāku? Priekš šīs sērijas Pamests - Brīdinājums: liela apjoma lejupielāde var izraisīt to, ka avoti kļūst lēnāki un/vai bloķē Mihon. Pieskarieties, lai uzzinātu vairāk. + Brīdinājums: liela apjoma lejupielāde var izraisīt to, ka avoti kļūst lēnāki un/vai bloķē %s. Pieskarieties, lai uzzinātu vairāk. Izlaists, jo neviena nodaļa nav izlasīta Atlasiet vāka attēlu Atlasiet dublējuma failu diff --git a/i18n/src/commonMain/moko-resources/ms/strings.xml b/i18n/src/commonMain/moko-resources/ms/strings.xml index 851cc3731d..8b7e22310c 100644 --- a/i18n/src/commonMain/moko-resources/ms/strings.xml +++ b/i18n/src/commonMain/moko-resources/ms/strings.xml @@ -542,7 +542,7 @@ Kemas kini yang besar membahayakan sumber dan mengakibatkan sumber menjadi perlahan dan juga peningkatan penggunaan bateri. Ketik untuk ketahui selebihnya. Hanya menggunakan Wi-Fi Setiap 3 hari - Amaran: muat turun secara pukal besar boleh menyebabkan sumber menjadi lebih perlahan dan/atau menyekat Mihon %s. Ketik untuk ketahui selebihnya. + Amaran: muat turun secara pukal besar boleh menyebabkan sumber menjadi lebih perlahan dan/atau menyekat %s. Ketik untuk ketahui selebihnya. Kemas kini semua Kemas kini aplikasi Hapus cache bab apabila membuka aplikasi diff --git a/i18n/src/commonMain/moko-resources/nb-rNO/strings.xml b/i18n/src/commonMain/moko-resources/nb-rNO/strings.xml index 93c520ddf7..a0525b959e 100644 --- a/i18n/src/commonMain/moko-resources/nb-rNO/strings.xml +++ b/i18n/src/commonMain/moko-resources/nb-rNO/strings.xml @@ -342,7 +342,7 @@ Etter opplastingsdato Sist brukt Faner - %02d min, %02d sek + %1$02d min, %2$02d sek Manglende kilder: Grå Vis kategorifaner @@ -554,7 +554,7 @@ Ingenting å fjerne Hoppet over fordi det er uleste kapitler Hoppet over fordi serien er fullført - Advarsel: store bulknedlastinger kan føre til at kilder blir tregere og/eller blokkerer Mihon. Trykk for å lære mer. + Advarsel: store bulknedlastinger kan føre til at kilder blir tregere og/eller blokkerer %s. Trykk for å lære mer. For hjelp til å fikse bibliotekoppdateringsfeil, se %1$s Kun omslags-rutenett Hopp over oppføringer som ikke er påbegynt @@ -769,7 +769,7 @@ Batteribruk i bakgrunnen For å installere kildeutvidelser. Ugyldig pakkebrønn URL - Legg til ekstra pakkebrønner i Mihon. URL-en må ende med \"index.min.json\". + Legg til ekstra pakkebrønner i %s. URL-en må ende med \"index.min.json\". Få varsler for oppdateringer i biblioteket og mer. Tillatelse er nødvendig for å installere utvidelser. Trykk her for å tillate. Ønsker du å slette pakkebrønnen \"%s\"? diff --git a/i18n/src/commonMain/moko-resources/ne/strings.xml b/i18n/src/commonMain/moko-resources/ne/strings.xml index 0c83424a44..8d53db1c7e 100644 --- a/i18n/src/commonMain/moko-resources/ne/strings.xml +++ b/i18n/src/commonMain/moko-resources/ne/strings.xml @@ -245,11 +245,7 @@ अविश्वसनीय एक्सटेन्शन समावेश नगर्नुहोस्: %s इंस्टलर - यो एक्सटेन्शन अविश्वसनीय प्रमाणपत्र सँग हस्ताक्षर गरिएको थियो र सक्रिय गरिएको थिएन। -\n -\nएक खराब एक्सटेन्शनले कुनै पनि भण्डारण लगइन प्रमाणहरू पढ्न वा मनमानी कोड कार्यान्वयन गर्न सक्छ। -\n -\nयस प्रमाणपत्रमा विश्वास गरेर तपाईंले यी जोखिमहरू स्वीकार गर्नुहुन्छ। + खराब एक्सटेन्शनहरूले कुनै पनि भण्डारण लगइन प्रमाणहरू पढ्न वा मनमानी कोड कार्यान्वयन गर्न सक्छ। \n \nयस एक्सटेन्शनमा विश्वास गरेर तपाईंले यी जोखिमहरू स्वीकार गर्नुहुन्छ। पूर्ण स्क्रिन रिडर खोलिएको बेला छोटकरीमा देखाउनुहोस् यदि विभाजित चौडा पृष्ठहरूको प्लेसमेन्ट पढ्ने दिशासँग मेल खाँदैन @@ -314,11 +310,9 @@ फिट उचाइ फिट चौडाइ ट्र्याकर - अवैध ब्याकअप फाइल + अवैध ब्याकअप फाइल: ब्याकअप सिर्जना गरियो - ब्याकअप फाइलबाट डेटा रिस्टोर हुनेछ। -\n -\nतपाईंले कुनै पनि छुटेको एक्सटेन्शनहरू स्थापना गर्न र तिनीहरूलाई प्रयोग गर्न पछि ट्र्याकिङ सेवाहरूमा लगइन गर्न आवश्यक हुनेछ। + तपाईंले कुनै पनि छुटेको एक्सटेन्शनहरू स्थापना गर्न र तिनीहरूलाई प्रयोग गर्न पछि ट्र्याकिङ सेवाहरूमा लगइन गर्न आवश्यक हुनेछ। रिस्टोर पहिले नै प्रगतिमा छ नेटवर्किङ ब्याकअप रिस्टोर असफल भयो @@ -539,7 +533,7 @@ डाउनलोड अघिल्लो अध्याय छैन थोरै जम्मा गर्ने ठाउँ भएको कारणले अध्याय डाउनलोड हुन सकिँदएन - सावधान: ठूलो हिस्सामा डाउनलोड गर्नाले स्रोत ढिलो चल्न अनि/वा Mihon लाई अवरुद्घ गर्न सक्नेछ। थप जान्न ट्याप गर्नुहोस्। + सावधान: ठूलो हिस्सामा डाउनलोड गर्नाले स्रोत ढिलो चल्न अनि/वा %s लाई अवरुद्घ गर्न सक्नेछ। थप जान्नको लागि यहाँ थिच्नुहोस्।। ट्र्याकिङ ट्र्याक गर्नुहोस् पढ्दै @@ -772,7 +766,7 @@ रिपो URL एक्सटेन्शन रिपो रिपो थप्नुहोस् - Mihon मा अतिरिक्त रिपो थप्नुहोस्। URL को अन्त्यमा \"index.min.json\" हुनुपर्छ। + %s मा अतिरिक्त रिपो थप्नुहोस्। URL को अन्त्यमा \"index.min.json\" हुनुपर्छ। अप्लाई के तपाइँ रिपो \"%s\" हटाउन चाहनुहुन्छ? खुला स्रोत रिपो @@ -877,4 +871,11 @@ पिन गरिएको स्रोतहरू तिप्नुहोस जारी माइग्रेट गर्नुपर्ने डाटा + ट्याब बन्द गर्नुहोस् + गैर-ASCII फाइल नामहरूलाई अनुमति नदिनुहोस् + समवर्ती स्रोत डाउनलोडहरू + समवर्ती पृष्ठ डाउनलोडहरू + प्रत्येक स्रोतबाट एकैसाथ डाउनलोड गरिने पृष्ठहरूको संख्या + स्थानान्तरण पछि हालको इन्ट्रीका डाउनलोडहरू मेटाउनुहोस् + थप किवर्डहरू (वैकल्पिक) diff --git a/i18n/src/commonMain/moko-resources/nn/strings.xml b/i18n/src/commonMain/moko-resources/nn/strings.xml index 2bc5fb703f..32ec8d2242 100644 --- a/i18n/src/commonMain/moko-resources/nn/strings.xml +++ b/i18n/src/commonMain/moko-resources/nn/strings.xml @@ -192,7 +192,7 @@ Reservekopi inneheld ingen manga. Gjenopprett bibliotek frå reservekopifil Gjenoppretting fullført - %02d min, %02d sek + %1$02d min, %2$02d sek Kva ønskjer du å ta reservekopi av? Lagar reservekopi Gjenoppretter reservekopi diff --git a/i18n/src/commonMain/moko-resources/pl/strings.xml b/i18n/src/commonMain/moko-resources/pl/strings.xml index 20f6c71e18..b6858d436f 100644 --- a/i18n/src/commonMain/moko-resources/pl/strings.xml +++ b/i18n/src/commonMain/moko-resources/pl/strings.xml @@ -769,7 +769,7 @@ \nWybrany folder:%2$s Unieważnij zaufanie nieznanym rozszerzeniom Nie masz ustawionych repozytoriów. - Dodaj repozytoria do Mihon. Powinien to być link z końcówką \"index.min.json\". + Dodaj repozytoria do %s. Powinien to być link z końcówką \"index.min.json\". To repozytorium jest już dodane! Na pewno chcesz usunąć repozytorium \"%s\"? Repozytorium open source diff --git a/i18n/src/commonMain/moko-resources/pt-rBR/strings.xml b/i18n/src/commonMain/moko-resources/pt-rBR/strings.xml index 09eb5dbe07..57da5b4ac9 100644 --- a/i18n/src/commonMain/moko-resources/pt-rBR/strings.xml +++ b/i18n/src/commonMain/moko-resources/pt-rBR/strings.xml @@ -357,7 +357,7 @@ Última utilizada Procurar por atualizações Guia sobre a fonte local - %02d min e %02d seg + %1$02d min e %2$02d seg Filtra todos os itens em sua biblioteca Cinza Modo de leitura @@ -542,7 +542,7 @@ Você deve manter cópias em outros locais também. Backups podem ter informações sensíveis incluindo senhas salvas; tenha cuidado se compartilhar. Somente no Wi-Fi A cada 3 dias - Aviso: grandes downloads em massa podem levar as fontes a ficarem lentas e/ou começarem a bloquear o Mihon. Toque para saber mais. + Aviso: grandes downloads em massa podem levar as fontes a ficarem lentas e/ou começarem a bloquear o %s. Toque para saber mais. Atualizar tudo Atualizações do aplicativo Limpar o cache de capítulos ao abrir o aplicativo @@ -772,7 +772,7 @@ Este repositório já existe! Atualização inteligente URL do repositório inválido - Adiciona repositórios adicionais ao Mihon. Deve ser uma URL que termine com \"index.min.json\". + Adiciona repositórios adicionais ao %s. Deve ser uma URL que termine com \"index.min.json\". Você deseja deletar o repositório \"%s\"? Deletar repositório Adicionar repositório diff --git a/i18n/src/commonMain/moko-resources/pt/strings.xml b/i18n/src/commonMain/moko-resources/pt/strings.xml index e11e6e6538..50034e17d4 100644 --- a/i18n/src/commonMain/moko-resources/pt/strings.xml +++ b/i18n/src/commonMain/moko-resources/pt/strings.xml @@ -356,7 +356,7 @@ Verificar por atualizações Licenças de código aberto Filtra todos os itens nasua biblioteca - %02d min., %02d seg. + %1$02d min., %2$02d seg. Cinza Modo de leitura Para esta série @@ -527,7 +527,7 @@ Guardar como ficheiro CBZ %1$d itens que não estão na biblioteca no banco de dados Nada para limpar - Aviso: downloads grandes em massa podem levar as fontes a ficarem lentas e/ou começarem a bloquear o Mihon. Toque para saber mais. + Aviso: downloads grandes em massa podem levar as fontes a ficarem lentas e/ou começarem a bloquear o %s. Toque para saber mais. Grandes atualizações prejudicam as fontes e podem levar a atualizações lentas e ainda ao aumento do uso da bateria. Toque para saber mais. Para obter ajuda sobre como corrigir erros de atualização da biblioteca, veja %1$s Limpar a cache de capítulos ao fechar a app @@ -750,7 +750,7 @@ Novo no %s? Recomendamos dar uma olhada no guia de introdução. Nord \"%1$s\" ao invés de \"%2$s\" - Adiciona repositórios adicionais ao Mihon. Deve ser uma URL que termine com \"index.min.json\". + Adiciona repositórios adicionais ao %s. Deve ser uma URL que termine com \"index.min.json\". URL do repositório inválido Deseja deletar o repositório \"%s\"? Abrir repositório da fonte diff --git a/i18n/src/commonMain/moko-resources/sa/strings.xml b/i18n/src/commonMain/moko-resources/sa/strings.xml index c2cb3dce7a..df87bd6384 100644 --- a/i18n/src/commonMain/moko-resources/sa/strings.xml +++ b/i18n/src/commonMain/moko-resources/sa/strings.xml @@ -319,7 +319,7 @@ प्रतिलेखनं समाददातु प्रतिलेखनस्य आवर्तनता प्रतिलेखनं पूर्वमेव प्रगतौ अस्ति - %02d निमेषाः %02d क्षणाः च + %1$02d निमेषाः %2$02d क्षणाः च प्रतिलेखनस्य समादानम् अनुत्तीर्णम् प्रतिलेखनम् अनुत्तीर्णम् प्रतिसंस्कारः पूर्वमेव प्रगत्याम् अस्ति @@ -538,7 +538,7 @@ तव ग्रन्थालये सर्वाः माङ्गाः शोधनीकरोति तव ग्रन्थालये न रक्षितानां माङ्गानां चरित्रं नाशय त्वं निश्चितरूपेण सङ्गृहीतान् अध्यायान् नाशयितुम् इच्छसि किम् ? - पूर्वसूचना -- महद्भाराणि अवारोपणानि कुर्यात् मूलानि मन्दानि। अपि च टाचीयोमिं निवारयेत्॥ + पूर्वसूचना -- महद्भाराणि अवारोपणानि कुर्यात् मूलानि मन्दानि। अपि च %s निवारयेत्॥ व्युत्पादकेभ्यः प्रसारयितुं दोषदत्तम् एकस्यां सञ्चिकायां रक्षति इमानि समायोजनानि प्राथमिकानि इव रक्षितुं त्वं निश्चितं किम् स्खलितानां परिहरणे साहाय्यं करिष्यति। संवेदनशीलदत्तांशाः न प्रेषिष्यते॥ diff --git a/i18n/src/commonMain/moko-resources/sah/strings.xml b/i18n/src/commonMain/moko-resources/sah/strings.xml index 9e8955cc11..b6135d89d4 100644 --- a/i18n/src/commonMain/moko-resources/sah/strings.xml +++ b/i18n/src/commonMain/moko-resources/sah/strings.xml @@ -225,7 +225,7 @@ Хаппаас куопуйа оҥоһуута Тугу куопуйалаары гынннын? Хаппаас куопуйа оҥоруута туола турар - %02d мүнүүтэ %02d сөкүүндэ + %1$02d мүнүүтэ %2$02d сөкүүндэ Төнүҥнэри бүттэ Трэкэрдар киирбэтилэр: Суох төрүттэр: diff --git a/i18n/src/commonMain/moko-resources/sc/strings.xml b/i18n/src/commonMain/moko-resources/sc/strings.xml index 61fb8363a8..f16505b2e7 100644 --- a/i18n/src/commonMain/moko-resources/sc/strings.xml +++ b/i18n/src/commonMain/moko-resources/sc/strings.xml @@ -540,7 +540,7 @@ Sos agiornamentos mannos diant pòdere fàghere dannu a sas fontes e causare agiornamentos prus lentos e fintzas un\'impreu de sa bateria prus mannu. Toca pro nde ischire de prus. Cada 3 dies Petzi cun su Wi-Fi - Dae cara: sos iscarrigamentos de massa mannos diant pòdere rallentare sas fontes e/o blocare Mihon. Toca pro nde ischire de prus. + Dae cara: sos iscarrigamentos de massa mannos diant pòdere rallentare sas fontes e/o blocare %s. Toca pro nde ischire de prus. Agiorna totu Agiornamentos de s\'aplicatzione %1$d elementos chi non sunt in sa biblioteca in sa base de datos @@ -775,7 +775,7 @@ Agiornamentu inteligente Annanghe unu depòsitu URL de su depòsitu - Annanghe depòsitos additzionales a Mihon. Custu diat dèpere èssere un\'URL chi acabbat cun \"index.min.json\". + Annanghe depòsitos additzionales a %s. Custu diat dèpere èssere un\'URL chi acabbat cun \"index.min.json\". Include impostatziones sensìbiles ( a es. getones de intrada a sos arrastadores) Luego Annanghe su matessi diff --git a/i18n/src/commonMain/moko-resources/sk/strings.xml b/i18n/src/commonMain/moko-resources/sk/strings.xml index 047cdfc510..81be5ccfc2 100644 --- a/i18n/src/commonMain/moko-resources/sk/strings.xml +++ b/i18n/src/commonMain/moko-resources/sk/strings.xml @@ -521,7 +521,7 @@ Uložiť logy o chybách do súboru na zdieľanie s vývojármi Obal Obal uložený - Prajete si vymazať kategóriu s? + Prajete si vymazať kategóriu %s? Vertikálne Sledovače, do ktorých nie ste prihlásení: DNS cez HTTPS (DoH) @@ -601,7 +601,7 @@ Vymazanie údajov WebView Údaje WebView boli vymazané Viac - Upozornenie: Veľké hromadné sťahovanie môže viesť k spomaleniu zdrojov a/alebo blokovaniu Mihon. Klepnutím sa dozviete viac. + Upozornenie: Veľké hromadné sťahovanie môže viesť k spomaleniu zdrojov a/alebo blokovaniu %s. Klepnutím sa dozviete viac. Veľké aktualizácie poškodzujú zdroje a môžu viesť k pomalším aktualizáciám a tiež k zvýšeniu spotreby batérie. Klepnutím sa dozviete viac. Zlyhané aktualizácie: %1$d Zálohovanie zlyhalo diff --git a/i18n/src/commonMain/moko-resources/sq/strings.xml b/i18n/src/commonMain/moko-resources/sq/strings.xml index 2cfb0e7ff7..3f8ab926d8 100644 --- a/i18n/src/commonMain/moko-resources/sq/strings.xml +++ b/i18n/src/commonMain/moko-resources/sq/strings.xml @@ -392,7 +392,7 @@ Pista Frekuenca rezervë I pa identifikuar ne gjurmuesit: - %02d min, %02d sek + %1$02d min, %2$02d sek Rezervimi/rivendosja mund të mos funksionojë siç duhet nëse Optimizimi MIUI është i çaktivizuar. Rivendos vargun e parazgjedhur të agjentit të përdoruesit Ndodhi një gabim gjatë pastrimit @@ -612,7 +612,7 @@ %s hasi në një gabim të papritur. Ne ju sugjerojmë që të fotografoni këtë mesazh, të hidhni regjistrat e aksidenteve dhe më pas ta shpërndani në kanalin tonë të mbështetjes në Discord. Rinisni aplikacionin Kapitujt nuk mund të shkarkoheshin për shkak të hapësirës së ulët të ruajtjes - Paralajmërim: shkarkimet e mëdha me shumicë mund të çojnë në ngadalësimin e burimeve dhe/ose bllokimin e Mihon. Trokit për të mësuar më shumë. + Paralajmërim: shkarkimet e mëdha me shumicë mund të çojnë në ngadalësimin e burimeve dhe/ose bllokimin e %s. Trokit për të mësuar më shumë. U gjetën kapituj të rinj Trokit për të mësuar më shumë Përditësimi i kopertinës dështoi diff --git a/i18n/src/commonMain/moko-resources/sr/strings.xml b/i18n/src/commonMain/moko-resources/sr/strings.xml index 39cf22b1fa..783dee64db 100644 --- a/i18n/src/commonMain/moko-resources/sr/strings.xml +++ b/i18n/src/commonMain/moko-resources/sr/strings.xml @@ -325,7 +325,7 @@ Враћање је већ у току Прављење резервне копије није успело Прављење резервне копије је већ у току - %02d мин, %02d сек + %1$02d мин, %2$02d сек Растојање од ивице Читање Увек прикажи транзицију поглавља @@ -546,7 +546,7 @@ Историја је избрисана Да ли сте сигурни? Цела историја ће бити изгубљена. Водич за миграцију извора - Упозорење: велики број преузимања може довести до успоравања извора и/или блокирања Mihon-а. Додирни да сазнаш више. + Упозорење: велики број преузимања може довести до успоравања извора и/или блокирања %s-а. Додирни да сазнаш више. Велика ажурирања штете изворима и могу довести до споријег ажурирања и повећања потрошње батерије. Кликни да сазнаш више. Ажурирај све Ажурирања апликације @@ -739,7 +739,7 @@ Додај репозиторију Избриши репозиторију URL репозиторије - Додај додатне репозиторије у Михон. Треба да буде URL који се завршава са „index.min.json”. + Додај додатне репозиторије у %s. Треба да буде URL који се завршава са „index.min.json”. Неисправан URL репозиторије Да ли желиш да избришеш репозиторију „%s”? Укључи и осетљива подешавања (нпр. токени за пријаву у пратиоце) diff --git a/i18n/src/commonMain/moko-resources/sv/strings.xml b/i18n/src/commonMain/moko-resources/sv/strings.xml index e62a9d2e85..3922722e8e 100644 --- a/i18n/src/commonMain/moko-resources/sv/strings.xml +++ b/i18n/src/commonMain/moko-resources/sv/strings.xml @@ -541,7 +541,7 @@ Språk Bara över Wi-Fi Stora uppdateringar skadar källor och kan leda till långsammare uppdateringar samt en ökad batterianvändning. Tryck för att få veta mer. - Varning: stora massnerladdningar kan leda till att källor blir långsamma och/eller blockerar Mihon. Tryck för att få veta mer. + Varning: stora massnerladdningar kan leda till att källor blir långsamma och/eller blockerar %s. Tryck för att få veta mer. Var 3:e dag Uppdatera alla Appuppdateringar @@ -778,7 +778,7 @@ Du har inga förråd inställda. Lägg till förråd Förråd URL - Lägg till ytterliga förråd till Mihon. Detta ska vara en URL som slutar med \"index.min.json\". + Lägg till ytterliga förråd till %s. Detta ska vara en URL som slutar med \"index.min.json\". Detta förråd existerar redan! Ta bort förråd Ogiltig förråds URL diff --git a/i18n/src/commonMain/moko-resources/th/strings.xml b/i18n/src/commonMain/moko-resources/th/strings.xml index db2e61589e..98f166ff3c 100644 --- a/i18n/src/commonMain/moko-resources/th/strings.xml +++ b/i18n/src/commonMain/moko-resources/th/strings.xml @@ -551,7 +551,7 @@ ทุก 3 วัน ข้อจำกัด: %s เฉพาะขณะเชื่อมต่อ Wi-Fi - คำเตือน: การดาวน์โหลดจำนวนมากอาจทำให้แหล่งที่มาทำงานช้าลงและ/หรือปิดกั้น Mihon แตะเพื่อเรียนรู้เพิ่มเติม + คำเตือน: การดาวน์โหลดจำนวนมากอาจทำให้แหล่งที่มาทำงานช้าลงและ/หรือปิดกั้น %s แตะเพื่อเรียนรู้เพิ่มเติม การอัปเดตจำนวนมากเป็นอันตรายต่อแหล่งที่มาและอาจทำให้การอัปเดตช้าลงและใช้งานแบตเตอรี่เพิ่มขึ้น แตะเพื่อเรียนรู้เพิ่มเติม เผยแพร่จบแล้ว ถูกยกเลิก @@ -771,7 +771,7 @@ อัปเดตอัจฉริยะ รีโพส่วนขยาย มีรีโพนี้อยู่แล้ว! - เพิ่มรีโพเพิ่มเติมให้กับ Mihon - ควรเป็น URL ที่ลงท้ายด้วย \"index.min.json\" + เพิ่มรีโพเพิ่มเติมให้กับ %s - ควรเป็น URL ที่ลงท้ายด้วย \"index.min.json\" ความถี่ในการอัปเดตกำหนดเอง: คุณไม่มีรีโพที่ตั้งค่าไว้ คู่มือการจัดเก็บข้อมูล diff --git a/i18n/src/commonMain/moko-resources/tr/strings.xml b/i18n/src/commonMain/moko-resources/tr/strings.xml index 3ee3673b07..eb9ed5035b 100644 --- a/i18n/src/commonMain/moko-resources/tr/strings.xml +++ b/i18n/src/commonMain/moko-resources/tr/strings.xml @@ -908,4 +908,5 @@ Tek seferde indirilen sayfa sayısı Her kaynak için aynı anda indirilen sayfa sayısı Tek seferde indirilen kaynak sayısı + Sekmeyi kapat diff --git a/i18n/src/commonMain/moko-resources/uk/strings.xml b/i18n/src/commonMain/moko-resources/uk/strings.xml index 2083182733..a0e392c346 100644 --- a/i18n/src/commonMain/moko-resources/uk/strings.xml +++ b/i18n/src/commonMain/moko-resources/uk/strings.xml @@ -538,7 +538,7 @@ Записувати докладні журнали до системного журналу (знижує продуктивність застосунку) Попередження: великі оновлення можуть призвести до сповільнення джерел або збільшити використання батареї. Тицьніть задля подробиць. Оновлення застосунку - Попередження: великий об\'єм завантажень може призвести до сповільнення роботи джерел та/або блокуванню Mihon. + Попередження: великий об\'єм завантажень може призвести до сповільнення роботи джерел та/або блокуванню %s. Оновити все Ви повинні зберігати декілька резервних копій в інших місцях. Резервні копії можуть містити конфіденційні дані, включно зі збереженими паролями; будьте обережні, якщо ділитеся ними. Попередження @@ -751,7 +751,7 @@ Репозиторії розширень Цей репозиторій вже існує! Посилання на репозиторій - Додати додаткові репозиторії до Mihon. Це повинні бути посилання які закінчуються на \"index.min.json\". + Додати додаткові репозиторії до %s. Це повинні бути посилання які закінчуються на \"index.min.json\". Нові розділи передбачено будуть випущені приблизно в %1$s, перевіряючи кожні %2$s. Оновлюєтесь з попередньої версії і не впевнені яку обрати? Перегляньте гайд по сховищу для додаткової інформації. Гайд по сховищу diff --git a/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml b/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml index 074df20c95..3eb075e501 100644 --- a/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml +++ b/i18n/src/commonMain/moko-resources/zh-rCN/strings.xml @@ -908,4 +908,5 @@ 同时下载的图源数量 同时下载的页数 每个图源同时下载的页数 + 关闭标签 diff --git a/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml b/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml index 595af13620..1aa46346b2 100644 --- a/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml +++ b/i18n/src/commonMain/moko-resources/zh-rTW/strings.xml @@ -899,4 +899,5 @@ 同時下載的來源數目 同時下載的頁數 每個來源同時下載的頁數 + 關閉頁籤 From 48657c3b7b98fdbf73a2ccdd3d3b4a0251b9426d Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 11 Nov 2025 08:28:42 +0000 Subject: [PATCH 42/82] Update softprops/action-gh-release action to v2.4.2 (#2683) (cherry picked from commit 69e5a1aea7fae7d2d52bc81bcfc17e06e9b1c16d) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6675a3455b..bbbd1b2b50 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -110,7 +110,7 @@ jobs: Animiru - name: Create GitHub Release - uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1 + uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe # v2.4.2 with: tag_name: ${{ needs.get_tag.outputs.tag }} name: Animiru ${{ needs.get_tag.outputs.tag }} From f7b60e8dc8af9b27493e1d7a6e757a840d2a6763 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 11 Nov 2025 08:29:40 +0000 Subject: [PATCH 43/82] Update dependency com.android.tools.build:gradle to v8.13.1 (#2685) (cherry picked from commit ec99ab3aef734e8b9ce156fe7493f72e7a8cc03a) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 8d4707e262..06a38c8f34 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -1,5 +1,5 @@ [versions] -agp_version = "8.13.0" +agp_version = "8.13.1" lifecycle_version = "2.9.4" paging_version = "3.3.6" interpolator_version = "1.0.0" From 2736f51a308c82c3850d3651ce3f3ecdfabe35f6 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 14 Nov 2025 07:07:51 +0000 Subject: [PATCH 44/82] Update sqldelight to v2.2.1 (#2704) (cherry picked from commit b1b79a63f0ec570ba2eac41f8faa50ecf7301e5d) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5f9beb6619..88a3093148 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ leakcanary = "2.14" moko = "0.25.1" okhttp_version = "5.3.0" shizuku_version = "13.1.5" -sqldelight = "2.1.0" +sqldelight = "2.2.1" sqlite = "2.6.1" voyager = "1.1.0-beta03" spotless = "8.0.0" From 39258e174964373825390c90d95384bf0e4c8a42 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 14 Nov 2025 07:09:25 +0000 Subject: [PATCH 45/82] Update actions/dependency-review-action action to v4.8.2 (#2686) Update GitHub Actions (cherry picked from commit c2bc95191b7522a636b9e7e7d433fd0205e99b82) --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ad4274361b..44f3686201 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,7 +38,7 @@ jobs: - name: Dependency Review if: github.event_name == 'pull_request' - uses: actions/dependency-review-action@40c09b7dc99638e5ddb0bfd91c1673effc064d8a # v4.8.1 + uses: actions/dependency-review-action@3c4e3dcb1aa7874d2c16be7d79418e9b7efd6261 # v4.8.2 - name: Set up JDK uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 From 671337a415512f93e5d007a78ef205e2410d9f62 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Fri, 14 Nov 2025 08:10:34 +0100 Subject: [PATCH 46/82] Translations update from Hosted Weblate (#2687) Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/am/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/bn/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/as/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/bn/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/fil/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/id/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ms/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/my/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ne/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ru/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/tr/ Translation: Mihon/Mihon Translation: Mihon/Mihon Plurals Co-authored-by: Anderhale Co-authored-by: Anderhale Co-authored-by: Ardiansyahset Co-authored-by: Infy's Tagalog Translations Co-authored-by: MajorTanya Co-authored-by: NGB-Was-Taken <76197326+NGB-Was-Taken@users.noreply.github.com> Co-authored-by: amigo browser (cherry picked from commit 32db0a5f4c261062883a11f86b7091f654bff568) --- .../commonMain/moko-resources/am/plurals.xml | 2 +- .../commonMain/moko-resources/as/strings.xml | 3 + .../commonMain/moko-resources/bn/plurals.xml | 24 ++++--- .../commonMain/moko-resources/bn/strings.xml | 66 ++++++++++++++++--- .../commonMain/moko-resources/fil/strings.xml | 1 + .../commonMain/moko-resources/in/strings.xml | 1 + .../commonMain/moko-resources/ms/strings.xml | 1 + .../commonMain/moko-resources/my/strings.xml | 4 +- .../commonMain/moko-resources/ne/strings.xml | 22 +++++++ .../commonMain/moko-resources/ru/strings.xml | 3 + .../commonMain/moko-resources/tr/strings.xml | 2 +- 11 files changed, 109 insertions(+), 20 deletions(-) diff --git a/i18n/src/commonMain/moko-resources/am/plurals.xml b/i18n/src/commonMain/moko-resources/am/plurals.xml index 711c7efabb..fe79a50005 100644 --- a/i18n/src/commonMain/moko-resources/am/plurals.xml +++ b/i18n/src/commonMain/moko-resources/am/plurals.xml @@ -5,7 +5,7 @@ %d ምድቦች - ከ 1 ደቂቃ በኋላ + ከ %1$s ደቂቃ በኋላ ከ %1$s ደቂቃዎች በኋላ diff --git a/i18n/src/commonMain/moko-resources/as/strings.xml b/i18n/src/commonMain/moko-resources/as/strings.xml index 616f0ea2f4..53d4ee14ab 100644 --- a/i18n/src/commonMain/moko-resources/as/strings.xml +++ b/i18n/src/commonMain/moko-resources/as/strings.xml @@ -834,4 +834,7 @@ সম্প্ৰসাৰণৰ বাবে ইতিহাস পঢ়া বন্ধ কৰক অটো একবৰ্ণী + পঢ়া অধ্যায়সহ এন্ট্ৰিসমূহ ৰক্ষা কৰক + লেখক + কলা diff --git a/i18n/src/commonMain/moko-resources/bn/plurals.xml b/i18n/src/commonMain/moko-resources/bn/plurals.xml index 2a5f798fde..d9d59dca10 100644 --- a/i18n/src/commonMain/moko-resources/bn/plurals.xml +++ b/i18n/src/commonMain/moko-resources/bn/plurals.xml @@ -1,19 +1,19 @@ - %1$s অধ্যায়সমূহ এবং ১টি আরও - %1$s অধ্যায়সমূহ এবং %2$dটি আরও + অধ্যায় %1$s এবং আরও ১টি + অধ্যায় %1$s এবং আরও %2$dটি - %1$s সময়ে %2$s ত্রুটি সম্পন্ন - %1$s সময়ে %2$sটি ত্রুটি সম্পন্ন + %1$s-এ সম্পন্ন হয়েছে, তবে %2$s ত্রুটি ছিল + %1$s-এ সম্পন্ন হয়েছে, তবে %2$sটি ত্রুটি ছিল - ১টি বিভাগ + %dটি বিভাগ %dটি বিভাগসমূহ - ১ মিনিট পর + %1$s মিনিট পর %1$s মিনিট পর @@ -41,7 +41,7 @@ %1$sটি অধ্যায় - ১টি বাকি আছে + %1$sটি বাকি আছে %1$sটি বাকি আছে @@ -77,7 +77,15 @@ %1$s পৃষ্ঠা - ১টি এন্ট্রি স্থানান্তর? + %1$dটি এন্ট্রি স্থানান্তর? %1$dটি এন্ট্রি স্থানান্তর? + + %1$dটি এন্ট্রি কপি করবেন? + %1$dটি এন্ট্রি কপি করবেন? + + + একটি এন্ট্রি বাদ দেওয়া হয়েছে + %1$dটি এন্ট্রি বাদ দেওয়া হয়েছে + diff --git a/i18n/src/commonMain/moko-resources/bn/strings.xml b/i18n/src/commonMain/moko-resources/bn/strings.xml index 8215a047f0..8c78103065 100644 --- a/i18n/src/commonMain/moko-resources/bn/strings.xml +++ b/i18n/src/commonMain/moko-resources/bn/strings.xml @@ -307,7 +307,7 @@ কখনই না সবসময় আনলক প্রয়োজন - নিরাপত্তা + নিরাপত্তা ও গোপনীয়তা বিজ্ঞপ্তিগুলি নিয়ন্ত্রণ করুন তারিখের রীতি চালু করুন @@ -348,7 +348,7 @@ %1$02d মিনিট, %2$02d সেকেন্ড উৎস অনুপলব্ধ: ব্যাকআপে কোনো মাংগা নেই। - ব্যাকআপ ফাইল গ্রহণযোগ্য নয় + ব্যাকআপ ফাইল গ্রহণযোগ্য নয়: বুকমার্ক করা অধ্যায়গুলি মুছে ফেলার অনুমতি দিন অধ্যায় মুছুন পার্শ্ব প্যাডিং @@ -547,7 +547,7 @@ ভাষা প্রতি ৩ দিন সুধু মাত্র ওয়িফি তে - সতর্কতা: বড় আপডেটগুলি উত্সের ক্ষতি করে এবং ধীরগতির আপডেটের দিকে নিয়ে যেতে পারে এবং ব্যাটারি ব্যবহারও বাড়িয়ে দিতে পারে + বেশি আপডেট সোর্সের ক্ষতি করতে পারে এবং আপডেট ধীর করে দিতে পারে, পাশাপাশি ব্যাটারি ব্যবহারের পরিমাণও বাড়াতে পারে। আরও জানতে ট্যাপ করুন। সতর্কতা: বড় আকারের ডাউনলোডের ফলে উৎসগুলি মন্থর হয়ে যেতে পারে এবং/অথবা %s ব্লক হয়ে যেতে পারে। আরও জানতে এখানে ট্যাপ করুন। অ্যাপ বন্দ্ধ করার সময় অধ্যায়ের ক্যাশে পরিষ্কার করুন তথ্যশালা পরিষ্কার @@ -604,7 +604,7 @@ অবৈধ ডাউনলোড সমুহ এখন না ডিবাগ তথ্য - বাদ দেওয়া হয়েছে কারণ সিরিজের আপডেটের প্রয়োজন নেই৷ + বাদ দেওয়া হয়েছে কারণ সিরিজের আপডেটের প্রয়োজন নেই আনলক %s সেট ইন্টারভেল ডাউনলোড করা ফাইল ডিলেট করুন @@ -623,11 +623,11 @@ নোটিফিকেশনের পারমিশন সকল সেটিং ডিফল্ট করুন অ্যাপের ইন্সটল করার পারমিশন - স্বাগতম + স্বাগতম! নিচের দিকে সরান বাদ দিন পরবর্তী - সোর্স এক্সটেনশন ইনস্টল করার জন্য + সোর্স এক্সটেনশন ইনস্টল করার জন্য। প্রথমে কিছু ঠিক করে নিন , পরবর্তীতে আপনি চাইলে সেটিং থেকে সবকিছু পরিবর্তন করতে পারবেন। ইন্টারনাল ইরর: বাকি ইনফরমেশন পেতে ক্যাশ লগ দেখুন স্কিপ করা হয়েছে কারণ আগে কোন চ্যাপ্টার পড়া হয়নি @@ -636,11 +636,61 @@ পরবর্তী আপডেটের সম্ভাব্য সময় লিংক কপি করুন স্বয়ংক্রিয় - অবজ্ঞাত অবস্থায় ব্যাটারি ব্যবহার + পটভূমিতে ব্যাটারি ব্যবহার এলোমেলো - লাইব্রেরি আপডেট এবং আরও অনেক কিছুর জন্য বিজ্ঞপ্তি পান। + লাইব্রেরি আপডেট এবং আরও বিষয়ে নোটিফিকেশন পান। যাই হোক যোগ করুন স্টোরেজ গাইড পুরোনো ভার্সন থেকে আপডেট করছেন এবং কী নির্বাচন করবেন তা নিশ্চিত নন? আরও তথ্যের জন্য স্টোরেজ গাইডটি দেখুন। আসন্ন + অপঠিত অধ্যায় + নোটস + নোট পরিবর্তন + ট্যাব বন্ধ + একটি ফোল্ডার নির্বাচন করুন যেখানে %1$s অধ্যায় ডাউনলোড, ব্যাকআপ এবং আরও কিছু সংরক্ষণ করবে।\n\nএকটি নির্দিষ্ট ফোল্ডার ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।\n\nনির্বাচিত ফোল্ডার: %2$s + দীর্ঘস্থায়ী লাইব্রেরি আপডেট, ডাউনলোড এবং ব্যাকআপ পুনরুদ্ধারে বিঘ্ন এড়িয়ে চলুন। + ক্র্যাশ লগ পাঠান + ডেভেলপারদের কাছে অজ্ঞাতনামা ক্র্যাশ লগ পাঠান। + অ্যানালিটিক্স অনুমতি দিন + অ্যাপের ফিচার উন্নত করতে অজ্ঞাতনামা ব্যবহার ডেটা পাঠান। + অনুমতি দিন + %s‑এ নতুন? আমাদের শুরু হওয়ারগাইড পড়ে দেখুন। + %s পুনরায় ইনস্টল করছেন? + টাইডাল ওয়েভ + আপেক্ষিক সময়চিহ্ন + \"%1$s\" এর পরিবর্তে \"%2$s\" + মাঙ্গা বিবরণে ছবি প্রদর্শন + নিরাপত্তা + অ্যানালিটিক্স ও ক্র্যাশ লগস + ক্র্যাশ লগ ও অ্যানালিটিক্স পাঠালে আমরা সমস্যা খুঁজে বের করে ঠিক করতে পারব, কর্মক্ষমতা ভালো হবে, এবং ভবিষ্যৎ আপডেটগুলো আপনার কাজে লাগবে + শুধু আনলিমিটেড নেটওয়ার্কে + স্মার্ট আপডেট + পরবর্তী রিলিজের সময় অনুমান করুন + আপডেট আইকনে অপঠিত সংখ্যা দেখান + ব্যবহার + অধ্যায় ডানে সোয়াইপ করলে + অধ্যায় বামে সোয়াইপ করলে + ডুপ্লিকেট পড়া অধ্যায়কে পড়া হিসেবে মার্ক করুন + একটি অধ্যায় পড়ার পর + নতুন অধ্যায় সংগ্রহের পর + অনুপস্থিত অধ্যায়ের চিহ্ন বন্ধ করুন + মিলহীন এন্ট্রি সরান + আরও কীওয়ার্ড যোগ করলে অনুসন্ধান ফলাফল সংকুচিত সাহায্য করে + অন্য কীওয়ার্ড (ঐচ্ছিক) + মাইগ্রেশনের পর বর্তমান এন্ট্রির ডাউনলোড মুছে ফেলুন + মাইগ্রেট করার জন্য ডেটা + অগ্রসর + পিন করা সোর্স নির্বাচন করুন + সক্রিয় সোর্স নির্বাচন করুন + কোনোটিই নির্বাচিত নয় + সব নির্বাচন করুন + উপলব্ধ + সিলেক্টেড + ভালো লেগেছে যেখানে… + ফ্ল্যাশ প্রতি + কালো + সাদা + সাদা আর কালো + যদি রিডার একটি ফাঁকা ছবি লোড করে, ধাপে ধাপে থ্রেশহোল্ড কমিয়ে দিন।\nসিলেক্টেড %s + পারফরম্যান্স অ্যাফেক্ট করবে। ফাঁকা ইমেজ সমস্যা থ্রেশহোল্ড কমিয়ে ঠিক না হলে কেবল এনেবল করবে diff --git a/i18n/src/commonMain/moko-resources/fil/strings.xml b/i18n/src/commonMain/moko-resources/fil/strings.xml index e96a5892cb..91c27c05fc 100644 --- a/i18n/src/commonMain/moko-resources/fil/strings.xml +++ b/i18n/src/commonMain/moko-resources/fil/strings.xml @@ -906,4 +906,5 @@ Kasabay na pag-download ng source Kasabay na pag-download ng pahina Mga pahina na nai-download nang sabay-sabay kada source + Isara ang tab diff --git a/i18n/src/commonMain/moko-resources/in/strings.xml b/i18n/src/commonMain/moko-resources/in/strings.xml index 5fad13bfb0..d8923d58b4 100644 --- a/i18n/src/commonMain/moko-resources/in/strings.xml +++ b/i18n/src/commonMain/moko-resources/in/strings.xml @@ -908,4 +908,5 @@ Ambil berkas sumber secara bersamaan Ambil berkas halaman secara bersamaan Halaman yang diunduh secara bersamaan per sumber + Tutup tab diff --git a/i18n/src/commonMain/moko-resources/ms/strings.xml b/i18n/src/commonMain/moko-resources/ms/strings.xml index 8b7e22310c..7d0e328dff 100644 --- a/i18n/src/commonMain/moko-resources/ms/strings.xml +++ b/i18n/src/commonMain/moko-resources/ms/strings.xml @@ -907,4 +907,5 @@ Muat turun sumber serentak Muat turun halaman serentak Halaman yang dimuat turun secara serentak setiap sumber + Tab Tutup diff --git a/i18n/src/commonMain/moko-resources/my/strings.xml b/i18n/src/commonMain/moko-resources/my/strings.xml index 60f4b818a2..ec466fd987 100644 --- a/i18n/src/commonMain/moko-resources/my/strings.xml +++ b/i18n/src/commonMain/moko-resources/my/strings.xml @@ -81,7 +81,7 @@ ခြေရာခံ အမှတ်အားဖြင့် စီပါ ကျပန်းစီမှု ရှာဖွေပါ - ရှာဖွေလိုသည်ကို ထည့်ပါ + ရှာဖွေလိုသည်ကို ထည့်ပါ… ရှာဖွေမှု ဆက်တင်များ အားလုံးကို ရွေးချယ်ပါ ရွေးချယ်မှု ပြောင်းပြန်ပါ @@ -255,7 +255,7 @@ အသက်အကန့်အသတ် ထည့်သွင်းရန် ခွင့်ပြုချက်လိုအပ်သည်။ ၁၈+ - ထည့်သွင်းနေဆဲ + ထည့်သွင်းနေဆဲ… ဤတွင် လိင်ပိုင်းဆိုင်ရာ အကြောင်းအရာများ (၁၈+နှစ်အထက်သာ သင့်လျော်သော) ပါဝင်နိုင်ပါသည်။ repo ထည့်သွင်းရန် repo ရှိပြီးသားဖြစ်သည်၊ diff --git a/i18n/src/commonMain/moko-resources/ne/strings.xml b/i18n/src/commonMain/moko-resources/ne/strings.xml index 8d53db1c7e..cf7d967df7 100644 --- a/i18n/src/commonMain/moko-resources/ne/strings.xml +++ b/i18n/src/commonMain/moko-resources/ne/strings.xml @@ -878,4 +878,26 @@ प्रत्येक स्रोतबाट एकैसाथ डाउनलोड गरिने पृष्ठहरूको संख्या स्थानान्तरण पछि हालको इन्ट्रीका डाउनलोडहरू मेटाउनुहोस् थप किवर्डहरू (वैकल्पिक) + थप किवर्डहरू थपेर खोज परिणामहरूलाई संकुचित गर्न मद्दत गर्दछ + मिल्दो परिणाम नभएको इन्ट्रीहरू लुकाउनुहोस् + नयाँ अध्याय नभएका इन्ट्रीहरू लुकाउनुहोस् + मिल्दो इन्ट्रीमा थप अध्यायहरू भए मात्र इन्ट्री देखाउनुहोस् + उन्नत खोज मोड + फराकिलो खोजको लागि शीर्षकलाई किवर्डहरूमा विभाजन गर्दछ + स्थानान्तरण + स्थानान्तरण (%1$d/%2$d) + प्रतिलिपि गर्नुहोस् + स्थानान्तरण + कुनै विकल्प भेटिएन + नवीनतम: %1$s + अज्ञात + आफै खोज्नुहोस् + स्थानान्तरण नगर्नुहोस् + अहिले स्थानान्तरण गर्नुहोस् + अहिले प्रतिलिपि गर्नुहोस् + स्थानान्तरण रोक्न चाहनुहुन्छ? + रोक्नुहोस् + रद्द गर्नुहोस् + प्रतिलिपि गर्नुहोस् + कुनै अध्यायहरू फेला परेनन्, यो इन्ट्री स्थानान्तरणका लागि प्रयोग गर्न सकिँदैन diff --git a/i18n/src/commonMain/moko-resources/ru/strings.xml b/i18n/src/commonMain/moko-resources/ru/strings.xml index 176d06479d..6fe02faa22 100644 --- a/i18n/src/commonMain/moko-resources/ru/strings.xml +++ b/i18n/src/commonMain/moko-resources/ru/strings.xml @@ -906,4 +906,7 @@ Не позволять наименования файлов в виде non-ASCII Обеспечивает совместимость с некоторыми носителями информации, которые не поддерживают Unicode. Когда этот функция включена, вам нужно будет вручную переименовать папки серий и источников, заменив non-ASCII символы на шестнадцатеричные UTF-8 в нижнем регистре. Файлы глав можно не переименовать. Параллельные загрузки с источников + Закрыть вкладку + Параллельные загрузки страниц + Число одновременных загрузок страниц с источника diff --git a/i18n/src/commonMain/moko-resources/tr/strings.xml b/i18n/src/commonMain/moko-resources/tr/strings.xml index eb9ed5035b..1ea442f797 100644 --- a/i18n/src/commonMain/moko-resources/tr/strings.xml +++ b/i18n/src/commonMain/moko-resources/tr/strings.xml @@ -850,7 +850,7 @@ Yeni bir bölüm geldiğinde Notları düzenle Notlar - …olduğu kısmı beğendim. + …olduğu kısmı beğendim Muhtemel yinelenenler Kitaplığınızda benzer isimli girdiler var.\n\nTaşımak için bir girdi seçin veya yine de ekleyin. Kitaplıkta olmayan girdilerin okunmuş bölümleri ve ilerlemeleri kaybolacaktır From a9c8e6ee48f86b5fce9b4b0fdce1750dc2d2183d Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 14 Nov 2025 07:17:55 +0000 Subject: [PATCH 47/82] Update dependency app.cash.sqldelight:sqlite-3-38-dialect to v2.2.1 (#2703) (cherry picked from commit f6a95a741667871df34288bdb6b67cafe2f79d54) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 88a3093148..844cd808a9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -86,7 +86,7 @@ leakcanary-plumber = { module = "com.squareup.leakcanary:plumber-android", versi sqldelight-android-driver = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions-jvm", version.ref = "sqldelight" } sqldelight-android-paging = { module = "app.cash.sqldelight:androidx-paging3-extensions", version.ref = "sqldelight" } -sqldelight-dialects-sql = { module = "app.cash.sqldelight:sqlite-3-38-dialect", version = "2.0.2" } +sqldelight-dialects-sql = { module = "app.cash.sqldelight:sqlite-3-38-dialect", version = "2.2.1" } junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher" } From 380a382fd5d2b6e1600e2486d3dcc37ef20b8fa4 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 15 Nov 2025 07:27:50 +0000 Subject: [PATCH 48/82] Update dependency com.squareup.okio:okio to v3.16.3 (#2709) (cherry picked from commit cab729c9396d54c98b1e8c4716b93814016deab4) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 844cd808a9..0edbd491c0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,7 +23,7 @@ okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp_ve okhttp-logging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp_version" } okhttp-brotli = { module = "com.squareup.okhttp3:okhttp-brotli", version.ref = "okhttp_version" } okhttp-dnsoverhttps = { module = "com.squareup.okhttp3:okhttp-dnsoverhttps", version.ref = "okhttp_version" } -okio = "com.squareup.okio:okio:3.16.2" +okio = "com.squareup.okio:okio:3.16.3" conscrypt-android = "org.conscrypt:conscrypt-android:2.5.3" From 060768ea66d42fea5ba7acc60d65e6afd8cb1e76 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 17 Nov 2025 07:53:23 +0000 Subject: [PATCH 49/82] Update okhttp monorepo to v5.3.1 (#2712) (cherry picked from commit 7947e1bd6a7bdd99fe6badde8b665da24f92ab7c) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0edbd491c0..86377acf5d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ aboutlib_version = "13.1.0" leakcanary = "2.14" moko = "0.25.1" -okhttp_version = "5.3.0" +okhttp_version = "5.3.1" shizuku_version = "13.1.5" sqldelight = "2.2.1" sqlite = "2.6.1" From fb592dc424c0397694dd06a50e6c161bef84baee Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 17 Nov 2025 07:58:37 +0000 Subject: [PATCH 50/82] Update dependency com.google.firebase:firebase-bom to v34.6.0 (#2707) (cherry picked from commit e5a693f224190a662f2192a06fd12ae2a03e7dc3) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 86377acf5d..e656d509de 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ sqlite = "2.6.1" voyager = "1.1.0-beta03" spotless = "8.0.0" ktlint-core = "1.7.1" -firebase-bom = "34.5.0" +firebase-bom = "34.6.0" markdown = "0.38.1" junit = "6.0.1" From 126fd6f9e747756c01ccf0a5c5001e0713ce3f5a Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 19 Nov 2025 08:07:57 +0000 Subject: [PATCH 51/82] Update dependency com.diffplug.spotless:spotless-plugin-gradle to v8.1.0 (#2721) (cherry picked from commit 8d81c94679e4ecc9e452b03feb7c08f524a4969d) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e656d509de..4535e4f1f7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ shizuku_version = "13.1.5" sqldelight = "2.2.1" sqlite = "2.6.1" voyager = "1.1.0-beta03" -spotless = "8.0.0" +spotless = "8.1.0" ktlint-core = "1.7.1" firebase-bom = "34.6.0" markdown = "0.38.1" From cdf0eeba8d084862db345886463904e5246e07e8 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 19 Nov 2025 08:08:15 +0000 Subject: [PATCH 52/82] Update okhttp monorepo to v5.3.2 (#2720) (cherry picked from commit 8b5dd39f1cbfd2eb8dd09cf42757206eeba631f7) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4535e4f1f7..d8ec87a504 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ aboutlib_version = "13.1.0" leakcanary = "2.14" moko = "0.25.1" -okhttp_version = "5.3.1" +okhttp_version = "5.3.2" shizuku_version = "13.1.5" sqldelight = "2.2.1" sqlite = "2.6.1" From 535d63ba48f1d41fe26f9553747c5b1adfd2de1b Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 19 Nov 2025 08:09:34 +0000 Subject: [PATCH 53/82] Update dependency io.kotest:kotest-assertions-core to v6.0.5 (#2717) (cherry picked from commit 9e27ae3d2b63210714d6b16add687d2b37a34736) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d8ec87a504..e65a0e4a78 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -90,7 +90,7 @@ sqldelight-dialects-sql = { module = "app.cash.sqldelight:sqlite-3-38-dialect", junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher" } -kotest-assertions = "io.kotest:kotest-assertions-core:6.0.4" +kotest-assertions = "io.kotest:kotest-assertions-core:6.0.5" mockk = "io.mockk:mockk:1.14.6" voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" } From 29f6b6037e19f70a1be74afe94e8b6431e05c107 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 19 Nov 2025 08:09:51 +0000 Subject: [PATCH 54/82] Update dependency com.squareup.okio:okio to v3.16.4 (#2716) (cherry picked from commit c17fc6792a3b8a5b6f31c107f165bfcda44617ae) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e65a0e4a78..d492c0e694 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,7 +23,7 @@ okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp_ve okhttp-logging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp_version" } okhttp-brotli = { module = "com.squareup.okhttp3:okhttp-brotli", version.ref = "okhttp_version" } okhttp-dnsoverhttps = { module = "com.squareup.okhttp3:okhttp-dnsoverhttps", version.ref = "okhttp_version" } -okio = "com.squareup.okio:okio:3.16.3" +okio = "com.squareup.okio:okio:3.16.4" conscrypt-android = "org.conscrypt:conscrypt-android:2.5.3" From eb38d31f6597a3ad191458da70d4f9a2d4b29d24 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 19 Nov 2025 09:10:08 +0100 Subject: [PATCH 55/82] Update actions/checkout action to v5.0.1 (#2715) (cherry picked from commit fc2c8c06a940392161cf5110e222edbedf9b7e47) --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 44f3686201..6c41dd476d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,7 +34,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Dependency Review if: github.event_name == 'pull_request' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bbbd1b2b50..1f26b432bd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,7 +35,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Set up JDK uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 From 88c977cd303e68cd1e77b559a407407e5f6f3ffd Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 23 Nov 2025 08:28:20 +0100 Subject: [PATCH 56/82] Update actions/checkout action to v6 (#2729) (cherry picked from commit 8b862c2e46ada8ad56e8b5f66751f31f3579b76d) --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6c41dd476d..93c815d21b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,7 +34,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Dependency Review if: github.event_name == 'pull_request' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1f26b432bd..31df578e59 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,7 +35,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Set up JDK uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 From 527f3232e21b1672b8ad63b2f821da0d018a7c5a Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 23 Nov 2025 07:29:06 +0000 Subject: [PATCH 57/82] Update lifecycle.version to v2.10.0 (#2726) (cherry picked from commit 6f497ed03181b15cb79899c689ffe70353656f0b) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 06a38c8f34..3cee2939e0 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -1,6 +1,6 @@ [versions] agp_version = "8.13.1" -lifecycle_version = "2.9.4" +lifecycle_version = "2.10.0" paging_version = "3.3.6" interpolator_version = "1.0.0" From 6c852d31946cacc8943a59fec6d9d2ce473246b5 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 23 Nov 2025 07:29:28 +0000 Subject: [PATCH 58/82] Update sqlite to v2.6.2 (#2724) (cherry picked from commit 4a3339a21f479bd57a7765cbeb092674aa2e8507) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d492c0e694..9eb545b170 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ moko = "0.25.1" okhttp_version = "5.3.2" shizuku_version = "13.1.5" sqldelight = "2.2.1" -sqlite = "2.6.1" +sqlite = "2.6.2" voyager = "1.1.0-beta03" spotless = "8.1.0" ktlint-core = "1.7.1" From 4058597ca6b34731b5678df3b5fb3e9431357b96 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 23 Nov 2025 07:29:50 +0000 Subject: [PATCH 59/82] Update moko to v0.25.2 (#2723) (cherry picked from commit 05c7df2ed32b429f1ed3f1425e854c1867813a21) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9eb545b170..17c005ca73 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] aboutlib_version = "13.1.0" leakcanary = "2.14" -moko = "0.25.1" +moko = "0.25.2" okhttp_version = "5.3.2" shizuku_version = "13.1.5" sqldelight = "2.2.1" From 0223d524f6285611f65d8d86e37bd04077f1660a Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 23 Nov 2025 07:31:50 +0000 Subject: [PATCH 60/82] Update dependency androidx.activity:activity-compose to v1.12.0 (#2725) (cherry picked from commit e6ca458e1f4cad3786d685ce8412ad40aed5155d) --- gradle/compose.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index f1b9b2d584..0ab584bef4 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -2,7 +2,7 @@ compose-bom = "2025.09.00" [libraries] -activity = "androidx.activity:activity-compose:1.11.0" +activity = "androidx.activity:activity-compose:1.12.0" bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } foundation = { module = "androidx.compose.foundation:foundation" } animation = { module = "androidx.compose.animation:animation" } From ab6f2359933b1cdc10405843983f360a3dbd251b Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 20:41:43 +0100 Subject: [PATCH 61/82] Update dependency com.pinterest.ktlint:ktlint-cli to v1.8.0 Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .editorconfig | 1 + .../tachiyomi/ui/player/PlayerActivity.kt | 4 +- .../tachiyomi/ui/player/PlayerViewModel.kt | 86 +++++++++++-------- .../ui/player/controls/PlayerControls.kt | 2 +- .../network/interceptor/WebViewInterceptor.kt | 2 +- gradle/libs.versions.toml | 2 +- .../presentation/core/util/Elevation.kt | 2 +- .../presentation/core/util/Scrollbar.kt | 2 +- 8 files changed, 60 insertions(+), 41 deletions(-) diff --git a/.editorconfig b/.editorconfig index c7c0ccbc7d..fe6f1e7b41 100644 --- a/.editorconfig +++ b/.editorconfig @@ -29,3 +29,4 @@ ktlint_standard_function-expression-body = disabled ktlint_standard_function-signature = disabled ktlint_standard_type-argument-comment = disabled ktlint_standard_type-parameter-comment = disabled +ktlint_standard_blank-line-between-when-conditions = disabled diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt index 0cc7ef5acf..9990436e0b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt @@ -15,7 +15,7 @@ * limitations under the License. */ -/** +/* * Code is a mix between PlayerActivity from mpvKt and the former * PlayerActivity from Aniyomi. */ @@ -1321,7 +1321,7 @@ class PlayerActivity : BaseActivity() { } // AM (DISCORD_RPC) --> - /** + /* private fun updateDiscordRPC(exitingPlayer: Boolean) { DiscordRPCService.discordScope.launchIO { if (connectionPreferences.enableDiscordRPC().get()) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt index defab558ad..2cb0f221e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt @@ -15,7 +15,7 @@ * limitations under the License. */ -/** +/* * Code is a mix between PlayerViewModel from mpvKt and the former * PlayerViewModel from Aniyomi. */ @@ -916,7 +916,15 @@ class PlayerViewModel @JvmOverloads constructor( } private fun seekByWithText(value: Int, text: String?) { - _doubleTapSeekAmount.update { if (value < 0 && it < 0 || pos.value + value > duration.value) 0 else it + value } + _doubleTapSeekAmount.update { + if (value < 0 && + (it < 0 || pos.value + value > duration.value) + ) { + 0 + } else { + it + value + } + } _seekText.update { text } _isSeekingForwards.value = value > 0 seekBy(value, preciseSeek) @@ -1075,38 +1083,48 @@ class PlayerViewModel @JvmOverloads constructor( ?: error("Requested episode of id $episodeId not found in episode list") val episodesForPlayer = episodes.filterNot { - anime.unseenFilterRaw == Anime.EPISODE_SHOW_SEEN && - !it.seen || - anime.unseenFilterRaw == Anime.EPISODE_SHOW_UNSEEN && - it.seen || - anime.downloadedFilterRaw == Anime.EPISODE_SHOW_DOWNLOADED && - !downloadManager.isEpisodeDownloaded( - it.name, - it.scanlator, - it.url, - // AM (CUSTOM_INFORMATION) --> - anime.ogTitle, - // <-- AM (CUSTOM_INFORMATION) - anime.source, - ) || - anime.downloadedFilterRaw == Anime.EPISODE_SHOW_NOT_DOWNLOADED && - downloadManager.isEpisodeDownloaded( - it.name, - it.scanlator, - it.url, - // AM (CUSTOM_INFORMATION) --> - anime.ogTitle, - // <-- AM (CUSTOM_INFORMATION) - anime.source, - ) || - anime.bookmarkedFilterRaw == Anime.EPISODE_SHOW_BOOKMARKED && - !it.bookmark || - anime.bookmarkedFilterRaw == Anime.EPISODE_SHOW_NOT_BOOKMARKED && - it.bookmark || - anime.fillermarkedFilterRaw == Anime.EPISODE_SHOW_FILLERMARKED && - !it.fillermark || - anime.fillermarkedFilterRaw == Anime.EPISODE_SHOW_NOT_FILLERMARKED && - it.fillermark + (anime.unseenFilterRaw == Anime.EPISODE_SHOW_SEEN && !it.seen) || + (anime.unseenFilterRaw == Anime.EPISODE_SHOW_UNSEEN && it.seen) || + ( + anime.downloadedFilterRaw == Anime.EPISODE_SHOW_DOWNLOADED && + !downloadManager.isEpisodeDownloaded( + it.name, + it.scanlator, + it.url, + // AM (CUSTOM_INFORMATION) --> + anime.ogTitle, + // <-- AM (CUSTOM_INFORMATION) + anime.source, + ) + ) || + ( + anime.downloadedFilterRaw == Anime.EPISODE_SHOW_NOT_DOWNLOADED && + downloadManager.isEpisodeDownloaded( + it.name, + it.scanlator, + it.url, + // AM (CUSTOM_INFORMATION) --> + anime.ogTitle, + // <-- AM (CUSTOM_INFORMATION) + anime.source, + ) + ) || + ( + anime.bookmarkedFilterRaw == Anime.EPISODE_SHOW_BOOKMARKED && + !it.bookmark + ) || + ( + anime.bookmarkedFilterRaw == Anime.EPISODE_SHOW_NOT_BOOKMARKED && + it.bookmark + ) || + ( + anime.fillermarkedFilterRaw == Anime.EPISODE_SHOW_FILLERMARKED && + !it.fillermark + ) || + ( + anime.fillermarkedFilterRaw == Anime.EPISODE_SHOW_NOT_FILLERMARKED && + it.fillermark + ) }.toMutableList() if (episodesForPlayer.all { it.id != episodeId }) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/PlayerControls.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/PlayerControls.kt index a26739f742..6c1e538c27 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/PlayerControls.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/PlayerControls.kt @@ -327,7 +327,7 @@ fun PlayerControls( } AnimatedVisibility( visible = - (controlsShown && !areControlsLocked || gestureSeekAmount != null) || + (controlsShown && (!areControlsLocked || gestureSeekAmount != null)) || isLoading || isLoadingEpisode, enter = fadeIn(playerControlsEnterAnimationSpec()), diff --git a/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt index e18fa42997..1223d51a47 100644 --- a/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt @@ -33,7 +33,7 @@ abstract class WebViewInterceptor( // Crashes on some devices. We skip this in some cases since the only impact is slower // WebView init in those rare cases. // See https://bugs.chromium.org/p/chromium/issues/detail?id=1279562 - if (DeviceUtil.isMiui || Build.VERSION.SDK_INT == Build.VERSION_CODES.S && DeviceUtil.isSamsung) { + if (DeviceUtil.isMiui || (Build.VERSION.SDK_INT == Build.VERSION_CODES.S && DeviceUtil.isSamsung)) { return@lazy } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 17c005ca73..722fb3a6bc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,7 @@ sqldelight = "2.2.1" sqlite = "2.6.2" voyager = "1.1.0-beta03" spotless = "8.1.0" -ktlint-core = "1.7.1" +ktlint-core = "1.8.0" firebase-bom = "34.6.0" markdown = "0.38.1" junit = "6.0.1" diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/util/Elevation.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/util/Elevation.kt index 67792fbaf3..a3001aa3eb 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/util/Elevation.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/util/Elevation.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -/** +/* * Straight copy from Compose M3 for Button fork */ diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt index 4ea8c5989f..0bdbd7d983 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt @@ -24,7 +24,7 @@ package tachiyomi.presentation.core.util * SOFTWARE. */ -/** +/* * Code taken from https://gist.github.com/mxalbert1996/33a360fcab2105a31e5355af98216f5a * with some modifications to handle contentPadding. * From d59642ca0e1cf42d70f97b9a708cffbeac2758fc Mon Sep 17 00:00:00 2001 From: NGB-Was-Taken <76197326+ngb-was-taken@users.noreply.github.com> Date: Sun, 23 Nov 2025 09:16:38 +0100 Subject: [PATCH 62/82] Fix shizuku installer not updating installed extensions (#2697) Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> (cherry picked from commit c3d858a5613a133352f6b140916d05de7f752771) --- .../java/mihon/app/shizuku/ShellInterface.kt | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/mihon/app/shizuku/ShellInterface.kt b/app/src/main/java/mihon/app/shizuku/ShellInterface.kt index 3326ff2705..216f82b30f 100644 --- a/app/src/main/java/mihon/app/shizuku/ShellInterface.kt +++ b/app/src/main/java/mihon/app/shizuku/ShellInterface.kt @@ -75,6 +75,12 @@ class ShellInterface : IShellInterface.Stub() { .invoke(pmInterface) val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL).apply { + val installFlags = this::class.java.getField("installFlags") + installFlags.set( + this, + installFlags.getInt(this) or REPLACE_EXISTING_INSTALL_FLAG, + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { setPackageSource(PackageInstaller.PACKAGE_SOURCE_STORE) } @@ -105,26 +111,27 @@ class ShellInterface : IShellInterface.Stub() { .getMethod("openSession", Int::class.java) .invoke(packageInstaller, sessionId) - ( - session::class.java.getMethod( - "openWrite", - String::class.java, - Long::class.java, - Long::class.java, - ).invoke(session, "extension", 0L, apk.length) as ParcelFileDescriptor - ).let { fd -> - val revocable = Class.forName("android.os.SystemProperties") - .getMethod("getBoolean", String::class.java, Boolean::class.java) - .invoke(null, "fw.revocable_fd", false) as Boolean - - if (revocable) { - ParcelFileDescriptor.AutoCloseOutputStream(fd) - } else { - Class.forName($$"android.os.FileBridge$FileBridgeOutputStream") - .getConstructor(ParcelFileDescriptor::class.java) - .newInstance(fd) as OutputStream + session::class.java.getMethod( + "openWrite", + String::class.java, + Long::class.java, + Long::class.java, + ) + .invoke(session, "extension", 0L, apk.length) + .let { it as ParcelFileDescriptor } + .let { fd -> + val revocable = Class.forName("android.os.SystemProperties") + .getMethod("getBoolean", String::class.java, Boolean::class.java) + .invoke(null, "fw.revocable_fd", false) as Boolean + + if (revocable) { + ParcelFileDescriptor.AutoCloseOutputStream(fd) + } else { + Class.forName($$"android.os.FileBridge$FileBridgeOutputStream") + .getConstructor(ParcelFileDescriptor::class.java) + .newInstance(fd) as OutputStream + } } - } .use { output -> apk.createInputStream().use { input -> input.copyTo(output) } } @@ -174,3 +181,7 @@ class ShellInterface : IShellInterface.Stub() { return shellContext.createPackageContext("com.android.shell", 0) } } + +// Constant hidden from the SDK +// https://cs.android.com/android/platform/superproject/main/+/512046e84bcc51cc241bc6599f83ab345e93ab12:frameworks/base/core/java/android/content/pm/PackageManager.java;l=1682-1689 +private const val REPLACE_EXISTING_INSTALL_FLAG = 0x00000002 From e851f899034dceaa31ff8e13779a3c8f82a4ecbe Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+antsylich@users.noreply.github.com> Date: Sun, 23 Nov 2025 19:05:30 +0100 Subject: [PATCH 63/82] Fix mass migration not using the same search queries as individual migration (#2736) (cherry picked from commit 7161bc2e825bdfd66a1829f7dce42bd0570b1008) --- .../feature/migration/list/search/BaseSmartSearchEngine.kt | 4 ++-- .../feature/migration/list/search/SmartSourceSearchEngine.kt | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/mihon/feature/migration/list/search/BaseSmartSearchEngine.kt b/app/src/main/java/mihon/feature/migration/list/search/BaseSmartSearchEngine.kt index 988b104fe0..10b5508265 100644 --- a/app/src/main/java/mihon/feature/migration/list/search/BaseSmartSearchEngine.kt +++ b/app/src/main/java/mihon/feature/migration/list/search/BaseSmartSearchEngine.kt @@ -41,8 +41,8 @@ abstract class BaseSmartSearchEngine( val eligibleAnime = supervisorScope { queries.map { query -> async(Dispatchers.Default) { - val builtQuery = if (extraSearchParams != null) { - "$query ${extraSearchParams.trim()}" + val builtQuery = if (!extraSearchParams.isNullOrBlank()) { + "$query $extraSearchParams" } else { query } diff --git a/app/src/main/java/mihon/feature/migration/list/search/SmartSourceSearchEngine.kt b/app/src/main/java/mihon/feature/migration/list/search/SmartSourceSearchEngine.kt index f5fa531db9..b5b9b2996e 100644 --- a/app/src/main/java/mihon/feature/migration/list/search/SmartSourceSearchEngine.kt +++ b/app/src/main/java/mihon/feature/migration/list/search/SmartSourceSearchEngine.kt @@ -1,7 +1,6 @@ package mihon.feature.migration.list.search import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource -import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.SAnime import mihon.domain.anime.model.toDomainAnime import tachiyomi.domain.anime.model.Anime @@ -23,6 +22,6 @@ class SmartSourceSearchEngine(extraSearchParams: String?) : BaseSmartSearchEngin } private fun makeSearchAction(source: AnimeCatalogueSource): SearchAction = { query -> - source.getSearchAnime(1, query, AnimeFilterList()).animes + source.getSearchAnime(1, query, source.getFilterList()).animes } } From 1be89790bf2dfcc54f26748c17909033757391a0 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 20:50:57 +0100 Subject: [PATCH 64/82] Cleanup BaseOAuthLoginActivity and TrackLoginActivity Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../connection/GoogleDriveLoginActivity.kt | 6 +- .../setting/track/BaseOAuthLoginActivity.kt | 10 ++- .../ui/setting/track/TrackLoginActivity.kt | 84 ++++++++----------- 3 files changed, 48 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/connection/GoogleDriveLoginActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/connection/GoogleDriveLoginActivity.kt index 67a1c3a953..1a8293806b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/connection/GoogleDriveLoginActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/connection/GoogleDriveLoginActivity.kt @@ -14,9 +14,9 @@ import uy.kohesive.injekt.api.get class GoogleDriveLoginActivity : BaseOAuthLoginActivity() { private val googleDriveService = Injekt.get() - override fun handleResult(data: Uri?) { - val code = data?.getQueryParameter("code") - val error = data?.getQueryParameter("error") + override fun handleResult(uri: Uri) { + val code = uri.getQueryParameter("code") + val error = uri.getQueryParameter("error") if (code != null) { lifecycleScope.launchIO { googleDriveService.handleAuthorizationCode( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/BaseOAuthLoginActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/BaseOAuthLoginActivity.kt index 92302d7181..a971594932 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/BaseOAuthLoginActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/BaseOAuthLoginActivity.kt @@ -14,7 +14,7 @@ abstract class BaseOAuthLoginActivity : BaseActivity() { internal val trackerManager: TrackerManager by injectLazy() - abstract fun handleResult(data: Uri?) + abstract fun handleResult(uri: Uri) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -23,7 +23,13 @@ abstract class BaseOAuthLoginActivity : BaseActivity() { LoadingScreen() } - handleResult(intent.data) + + val data = intent.data + if (data == null) { + returnToSettings() + } else { + handleResult(data) + } } internal fun returnToSettings() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/TrackLoginActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/TrackLoginActivity.kt index 8dacdd1961..c2e6dcd386 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/TrackLoginActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/TrackLoginActivity.kt @@ -2,86 +2,76 @@ package eu.kanade.tachiyomi.ui.setting.track import android.net.Uri import androidx.lifecycle.lifecycleScope -import tachiyomi.core.common.util.lang.launchIO +import kotlinx.coroutines.launch class TrackLoginActivity : BaseOAuthLoginActivity() { - override fun handleResult(data: Uri?) { - when (data?.host) { - "anilist-auth" -> handleAnilist(data) - "bangumi-auth" -> handleBangumi(data) - "myanimelist-auth" -> handleMyAnimeList(data) - "shikimori-auth" -> handleShikimori(data) - // AY --> - "simkl-auth" -> handleSimkl(data) - // <-- AY + override fun handleResult(uri: Uri) { + val data = when { + !uri.encodedQuery.isNullOrBlank() -> uri.encodedQuery + !uri.encodedFragment.isNullOrBlank() -> uri.encodedFragment + else -> null } - } + ?.split("&") + ?.filter { it.isNotBlank() } + ?.associate { + val parts = it.split("=", limit = 2).map(Uri::decode) + parts[0] to parts.getOrNull(1) + } + .orEmpty() - private fun handleAnilist(data: Uri) { - val regex = "(?:access_token=)(.*?)(?:&)".toRegex() - val matchResult = regex.find(data.fragment.toString()) - if (matchResult?.groups?.get(1) != null) { - lifecycleScope.launchIO { - trackerManager.aniList.login(matchResult.groups[1]!!.value) - returnToSettings() + lifecycleScope.launch { + when (uri.host) { + "anilist-auth" -> handleAnilist(data["access_token"]) + "bangumi-auth" -> handleBangumi(data["code"]) + "myanimelist-auth" -> handleMyAnimeList(data["code"]) + "shikimori-auth" -> handleShikimori(data["code"]) + // AY --> + "simkl-auth" -> handleSimkl(data["code"]) + // <-- AY } + returnToSettings() + } + } + + private suspend fun handleAnilist(accessToken: String?) { + if (accessToken != null) { + trackerManager.aniList.login(accessToken) } else { trackerManager.aniList.logout() - returnToSettings() } } - private fun handleBangumi(data: Uri) { - val code = data.getQueryParameter("code") + private suspend fun handleBangumi(code: String?) { if (code != null) { - lifecycleScope.launchIO { - trackerManager.bangumi.login(code) - returnToSettings() - } + trackerManager.bangumi.login(code) } else { trackerManager.bangumi.logout() - returnToSettings() } } - private fun handleMyAnimeList(data: Uri) { - val code = data.getQueryParameter("code") + private suspend fun handleMyAnimeList(code: String?) { if (code != null) { - lifecycleScope.launchIO { - trackerManager.myAnimeList.login(code) - returnToSettings() - } + trackerManager.myAnimeList.login(code) } else { trackerManager.myAnimeList.logout() - returnToSettings() } } - private fun handleShikimori(data: Uri) { - val code = data.getQueryParameter("code") + private suspend fun handleShikimori(code: String?) { if (code != null) { - lifecycleScope.launchIO { - trackerManager.shikimori.login(code) - returnToSettings() - } + trackerManager.shikimori.login(code) } else { trackerManager.shikimori.logout() - returnToSettings() } } // AY --> - private fun handleSimkl(data: Uri?) { - val code = data?.getQueryParameter("code") + private suspend fun handleSimkl(code: String?) { if (code != null) { - lifecycleScope.launchIO { - trackerManager.simkl.login(code) - returnToSettings() - } + trackerManager.simkl.login(code) } else { trackerManager.simkl.logout() - returnToSettings() } } // <-- AY From 214ee3cee6e37baeea57e0b8945fac73ddeaa541 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 1 Dec 2025 17:37:56 +0000 Subject: [PATCH 65/82] Update dependency io.kotest:kotest-assertions-core to v6.0.7 (#2749) (cherry picked from commit 556371e1c89bfb0961b63629e79d3fed6a8e7999) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 722fb3a6bc..e0ad12a6c4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -90,7 +90,7 @@ sqldelight-dialects-sql = { module = "app.cash.sqldelight:sqlite-3-38-dialect", junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher" } -kotest-assertions = "io.kotest:kotest-assertions-core:6.0.5" +kotest-assertions = "io.kotest:kotest-assertions-core:6.0.7" mockk = "io.mockk:mockk:1.14.6" voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" } From 253e8c0d8dcd1853c6cb820446ee116050dd750d Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 1 Dec 2025 17:38:05 +0000 Subject: [PATCH 66/82] Update softprops/action-gh-release action to v2.5.0 (#2750) (cherry picked from commit 5b88f88198b4f452df237e0c52091623367c7e2a) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 31df578e59..0ca90b2c3f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -110,7 +110,7 @@ jobs: Animiru - name: Create GitHub Release - uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe # v2.4.2 + uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0 with: tag_name: ${{ needs.get_tag.outputs.tag }} name: Animiru ${{ needs.get_tag.outputs.tag }} From ccb881abb6283a4a5630fd510f6a97d5db063ccb Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 7 Dec 2025 07:33:47 +0100 Subject: [PATCH 67/82] Update GitHub Actions (#2757) (cherry picked from commit 97327555b3032c1d0a0039d3492a67c583ddb5e7) --- .github/workflows/build.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 93c815d21b..44fa083cd7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,14 +34,14 @@ jobs: steps: - name: Checkout - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Dependency Review if: github.event_name == 'pull_request' uses: actions/dependency-review-action@3c4e3dcb1aa7874d2c16be7d79418e9b7efd6261 # v4.8.2 - name: Set up JDK - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 + uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e # v5.1.0 with: java-version: 17 distribution: temurin diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0ca90b2c3f..3aee3423de 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,10 +35,10 @@ jobs: steps: - name: Checkout - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Set up JDK - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 + uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e # v5.1.0 with: java-version: 17 distribution: temurin From 05ea63aa95bda7c748dddcf4fb4d125b014656ee Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 7 Dec 2025 06:34:59 +0000 Subject: [PATCH 68/82] Update dependency io.mockk:mockk to v1.14.7 (#2771) (cherry picked from commit cadd36ad9a5721d19ea51b68910b8b3276965b3d) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e0ad12a6c4..3fd901c248 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -91,7 +91,7 @@ sqldelight-dialects-sql = { module = "app.cash.sqldelight:sqlite-3-38-dialect", junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher" } kotest-assertions = "io.kotest:kotest-assertions-core:6.0.7" -mockk = "io.mockk:mockk:1.14.6" +mockk = "io.mockk:mockk:1.14.7" voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" } voyager-screenmodel = { module = "cafe.adriel.voyager:voyager-screenmodel", version.ref = "voyager" } From fd802f44f645ffc2ea7ce982c80b7a2d0d39b67b Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sun, 7 Dec 2025 06:35:09 +0000 Subject: [PATCH 69/82] Update dependency androidx.activity:activity-compose to v1.12.1 (#2760) (cherry picked from commit 08a61a42e9b01f5591615e298c2fecc9f59762ac) --- gradle/compose.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index 0ab584bef4..4bf14354e6 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -2,7 +2,7 @@ compose-bom = "2025.09.00" [libraries] -activity = "androidx.activity:activity-compose:1.12.0" +activity = "androidx.activity:activity-compose:1.12.1" bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } foundation = { module = "androidx.compose.foundation:foundation" } animation = { module = "androidx.compose.animation:animation" } From bc72a4d9bb0d91c557491e106dcbaf757c315331 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 24 Dec 2025 23:07:22 +0100 Subject: [PATCH 70/82] Update tracker icons Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../track/components/TrackLogoIcon.kt | 21 ++----- .../TrackLogoIconPreviewProvider.kt | 4 -- .../eu/kanade/tachiyomi/data/track/Tracker.kt | 4 -- .../tachiyomi/data/track/anilist/Anilist.kt | 5 +- .../tachiyomi/data/track/bangumi/Bangumi.kt | 5 +- .../tachiyomi/data/track/jellyfin/Jellyfin.kt | 5 +- .../tachiyomi/data/track/kitsu/Kitsu.kt | 5 +- .../data/track/myanimelist/MyAnimeList.kt | 5 +- .../data/track/shikimori/Shikimori.kt | 5 +- .../tachiyomi/data/track/simkl/Simkl.kt | 5 +- .../ui/anime/track/TrackInfoDialog.kt | 1 - .../setting/track/BaseOAuthLoginActivity.kt | 1 - .../util/system/DisplayExtensions.kt | 1 - .../main/java/eu/kanade/test/DummyTracker.kt | 6 +- .../drawable-nodpi/ic_tracker_anilist.webp | Bin 2048 -> 0 bytes .../drawable-nodpi/ic_tracker_bangumi.webp | Bin 1354 -> 0 bytes .../drawable-nodpi/ic_tracker_jellyfin.webp | Bin 31950 -> 0 bytes .../res/drawable-nodpi/ic_tracker_kitsu.webp | Bin 8734 -> 0 bytes .../res/drawable-nodpi/ic_tracker_mal.webp | Bin 1404 -> 0 bytes .../drawable-nodpi/ic_tracker_shikimori.webp | Bin 2948 -> 0 bytes .../res/drawable-nodpi/ic_tracker_simkl.webp | Bin 8028 -> 0 bytes app/src/main/res/drawable/brand_anilist.xml | 21 +++++++ app/src/main/res/drawable/brand_bangumi.xml | 53 ++++++++++++++++++ app/src/main/res/drawable/brand_jellyfin.xml | 42 ++++++++++++++ app/src/main/res/drawable/brand_kitsu.xml | 21 +++++++ .../main/res/drawable/brand_myanimelist.xml | 16 ++++++ app/src/main/res/drawable/brand_shikimori.xml | 21 +++++++ app/src/main/res/drawable/brand_simkl.xml | 31 ++++++++++ 28 files changed, 219 insertions(+), 59 deletions(-) delete mode 100644 app/src/main/res/drawable-nodpi/ic_tracker_anilist.webp delete mode 100644 app/src/main/res/drawable-nodpi/ic_tracker_bangumi.webp delete mode 100644 app/src/main/res/drawable-nodpi/ic_tracker_jellyfin.webp delete mode 100644 app/src/main/res/drawable-nodpi/ic_tracker_kitsu.webp delete mode 100644 app/src/main/res/drawable-nodpi/ic_tracker_mal.webp delete mode 100644 app/src/main/res/drawable-nodpi/ic_tracker_shikimori.webp delete mode 100644 app/src/main/res/drawable-nodpi/ic_tracker_simkl.webp create mode 100644 app/src/main/res/drawable/brand_anilist.xml create mode 100644 app/src/main/res/drawable/brand_bangumi.xml create mode 100644 app/src/main/res/drawable/brand_jellyfin.xml create mode 100644 app/src/main/res/drawable/brand_kitsu.xml create mode 100644 app/src/main/res/drawable/brand_myanimelist.xml create mode 100644 app/src/main/res/drawable/brand_shikimori.xml create mode 100644 app/src/main/res/drawable/brand_simkl.xml diff --git a/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIcon.kt b/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIcon.kt index 7488d0da96..dc66d27de9 100644 --- a/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIcon.kt +++ b/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIcon.kt @@ -1,15 +1,11 @@ package eu.kanade.presentation.track.components import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color +import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter @@ -30,18 +26,13 @@ fun TrackLogoIcon( Modifier } - Box( + Image( + painter = painterResource(tracker.getLogo()), + contentDescription = tracker.name, modifier = modifier .size(48.dp) - .background(color = Color(tracker.getLogoColor()), shape = MaterialTheme.shapes.medium) - .padding(4.dp), - contentAlignment = Alignment.Center, - ) { - Image( - painter = painterResource(tracker.getLogo()), - contentDescription = tracker.name, - ) - } + .clip(MaterialTheme.shapes.medium), + ) } @PreviewLightDark diff --git a/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIconPreviewProvider.kt b/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIconPreviewProvider.kt index 3f5e4b840a..8799a062ad 100644 --- a/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIconPreviewProvider.kt +++ b/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIconPreviewProvider.kt @@ -1,8 +1,6 @@ package eu.kanade.presentation.track.components -import android.graphics.Color import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.test.DummyTracker @@ -13,8 +11,6 @@ internal class TrackLogoIconPreviewProvider : PreviewParameterProvider DummyTracker( id = 1L, name = "Dummy Tracker", - valLogoColor = Color.rgb(18, 25, 35), - valLogo = R.drawable.ic_tracker_anilist, ), ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt index d63990e585..97d43efc33 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt @@ -1,7 +1,6 @@ package eu.kanade.tachiyomi.data.track import androidx.annotation.CallSuper -import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.data.database.models.Track @@ -24,9 +23,6 @@ interface Tracker { val supportsPrivateTracking: Boolean - @ColorInt - fun getLogoColor(): Int - @DrawableRes fun getLogo(): Int diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt index b112c1260d..1fad9028d1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.data.track.anilist -import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.domain.track.model.toDbTrack import eu.kanade.tachiyomi.R @@ -57,9 +56,7 @@ class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { } } - override fun getLogo() = R.drawable.ic_tracker_anilist - - override fun getLogoColor() = Color.rgb(18, 25, 35) + override fun getLogo() = R.drawable.brand_anilist override fun getStatusList(): List { return listOf(WATCHING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_WATCH, REWATCHING) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt index 08215523c6..e30972cecb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.data.track.bangumi -import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Track @@ -80,9 +79,7 @@ class Bangumi(id: Long) : BaseTracker(id, "Bangumi") { return track } - override fun getLogo() = R.drawable.ic_tracker_bangumi - - override fun getLogoColor() = Color.rgb(240, 145, 153) + override fun getLogo() = R.drawable.brand_bangumi override fun getStatusList(): List { return listOf(WATCHING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_WATCH) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/Jellyfin.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/Jellyfin.kt index 64dba23b56..50fb293e28 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/Jellyfin.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/Jellyfin.kt @@ -1,7 +1,6 @@ // AY --> package eu.kanade.tachiyomi.data.track.jellyfin -import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.animesource.AnimeSource @@ -34,9 +33,7 @@ class Jellyfin(id: Long) : BaseTracker(id, "Jellyfin"), EnhancedTracker { val api by lazy { JellyfinApi(id, client) } - override fun getLogo() = R.drawable.ic_tracker_jellyfin - - override fun getLogoColor() = Color.rgb(0, 11, 37) + override fun getLogo() = R.drawable.brand_jellyfin override fun getStatusList(): List = listOf(UNSEEN, WATCHING, COMPLETED) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt index 72fb3848f2..f7879d0819 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.data.track.kitsu -import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Track @@ -37,9 +36,7 @@ class Kitsu(id: Long) : BaseTracker(id, "Kitsu"), DeletableTracker { private val api by lazy { KitsuApi(client, interceptor) } - override fun getLogo() = R.drawable.ic_tracker_kitsu - - override fun getLogoColor() = Color.rgb(51, 37, 50) + override fun getLogo() = R.drawable.brand_kitsu override fun getStatusList(): List { return listOf(WATCHING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_WATCH) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt index 640bbcd2cb..8be7149674 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.data.track.myanimelist -import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Track @@ -41,9 +40,7 @@ class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker { override val supportsReadingDates: Boolean = true - override fun getLogo() = R.drawable.ic_tracker_mal - - override fun getLogoColor() = Color.rgb(46, 81, 162) + override fun getLogo() = R.drawable.brand_myanimelist override fun getStatusList(): List { return listOf(WATCHING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_WATCH, REWATCHING) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt index 186038725c..58d66721ee 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.data.track.shikimori -import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Track @@ -98,9 +97,7 @@ class Shikimori(id: Long) : BaseTracker(id, "Shikimori"), DeletableTracker { return track } - override fun getLogo() = R.drawable.ic_tracker_shikimori - - override fun getLogoColor() = Color.rgb(40, 40, 40) + override fun getLogo() = R.drawable.brand_shikimori override fun getStatusList(): List { return listOf(WATCHING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_WATCH, REWATCHING) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/Simkl.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/Simkl.kt index 93046d7c07..7f87b720dd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/Simkl.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/Simkl.kt @@ -1,7 +1,6 @@ // AY --> package eu.kanade.tachiyomi.data.track.simkl -import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Track @@ -94,9 +93,7 @@ class Simkl(id: Long) : BaseTracker(id, "Simkl"), Tracker { return track } - override fun getLogo() = R.drawable.ic_tracker_simkl - - override fun getLogoColor() = Color.rgb(0, 0, 0) + override fun getLogo() = R.drawable.brand_simkl override fun getStatusList(): List { return listOf(WATCHING, COMPLETED, ON_HOLD, NOT_INTERESTING, PLAN_TO_WATCH) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/anime/track/TrackInfoDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/anime/track/TrackInfoDialog.kt index e8577e727b..d1a602a230 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/anime/track/TrackInfoDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/anime/track/TrackInfoDialog.kt @@ -85,7 +85,6 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import java.time.LocalDate -import java.time.ZoneId import java.time.ZoneOffset data class TrackInfoDialogHomeScreen( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/BaseOAuthLoginActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/BaseOAuthLoginActivity.kt index a971594932..08dcee2649 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/BaseOAuthLoginActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/BaseOAuthLoginActivity.kt @@ -23,7 +23,6 @@ abstract class BaseOAuthLoginActivity : BaseActivity() { LoadingScreen() } - val data = intent.data if (data == null) { returnToSettings() diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/DisplayExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/DisplayExtensions.kt index 08f230b75e..1569891dd9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/DisplayExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/DisplayExtensions.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.util.system -import android.app.Activity import android.content.Context import android.content.res.Configuration import android.os.Build diff --git a/app/src/main/java/eu/kanade/test/DummyTracker.kt b/app/src/main/java/eu/kanade/test/DummyTracker.kt index c717e54a4c..bcbc0e2813 100644 --- a/app/src/main/java/eu/kanade/test/DummyTracker.kt +++ b/app/src/main/java/eu/kanade/test/DummyTracker.kt @@ -1,6 +1,5 @@ package eu.kanade.test -import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.track.Tracker @@ -21,8 +20,7 @@ data class DummyTracker( override val supportsPrivateTracking: Boolean = false, override val isLoggedIn: Boolean = false, override val isLoggedInFlow: Flow = flowOf(false), - val valLogoColor: Int = Color.rgb(18, 25, 35), - val valLogo: Int = R.drawable.ic_tracker_anilist, + val valLogo: Int = R.drawable.brand_anilist, val valStatuses: List = (1L..6L).toList(), val valWatchingStatus: Long = 1L, val valRewatchingStatus: Long = 1L, @@ -35,8 +33,6 @@ data class DummyTracker( override val client: OkHttpClient get() = TODO("Not yet implemented") - override fun getLogoColor(): Int = valLogoColor - override fun getLogo(): Int = valLogo override fun getStatusList(): List = valStatuses diff --git a/app/src/main/res/drawable-nodpi/ic_tracker_anilist.webp b/app/src/main/res/drawable-nodpi/ic_tracker_anilist.webp deleted file mode 100644 index b553d6c497d12fdd6ba931a7672e3c17eb88b7f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 zcmV+b2>H3usB4{5hH8IlxZ z+qP}nwr$(?nq3vYc+eTqo$+nYM)ZFI;Q#;sF&v$uKH)vrxD+cB19jzagX%58Z=@{# zKH|a<${}g$R@2mY_g8Wk}sCiUqP82SND#Cc{iY)FS<`AhsAh$syEWfKOs*M~>gb zaLmGxLOj~IW_m<*C8<=DRKKJg?nBMSp`>Oc<@Hlil_;qdNd^9uR1->S zUsBPgq`FY~qeRZsm7DTNMCEsmNAl=ZHwGQzaJW%d01>7%GEwVlxsG)8g-Vd@!p&iv1d;r#^aIEgD`$uYp5RdBT;iCb6 zWza)V^&wc3!Ie5oz{hGtkc#Se;p6^)BrrhGVFj!R!10bC&YEfgWTW~Eu-5mt{w4@| zt%4=(xqc!@x2{TiMX3IBY_!$M7TwJd*r?2_>~Jsc2JDT_~wD zNhPABdL`v>BdJW3)QDYrxMq2})EUgp`PnY<{a(Q=AN6j@;x(l?+-2qQMR$fjr!v%j zI;REwer#B1O)kro{&H>M6 zjZBb~G6^y4K@JbsPZZxgn83C@NaRt3l+(bq!47is)AkG8;0PrFJodGJW z0IUE$kw%_NC8MIDrBZ3ouo4MnZsBbU3#1lH^$KaIFnJ^h7`evg2HFaZAkcmNi3+Mn*M&tw?}46d3S7eF-|!ZFS;Bfcs; zM%6SFZJB#XY(_T|FOB&qYUA}7O!v^Rl{1Bl*%6Ugv(tZ7k^$r~w`k^sdhR3``IUjugas7gUs~A*&HrNb4oG-r)CV;rQxuVO5;IMKFuk|=g^*oX3Lpz(Ntsl5FDe2ysB6gW${3RkhTm87p zFUPDVA%L;{RLJCPyb>%IgUf>BuJPOd<%+Do$T7AfZ2Q@l)65pF#DB^m=#g53yEC-F zF|@p{_JY7~L*R?nE|J90RvDE+Gf@gwc9={1?JmU_OXKu(i=ba%8_JPlq$MFiwnb9N zZ05nF$xAS6cYw+dK#OU+d#isKb8vLzdUrOZqM_f<2Y!ROR_hIpoSM{C`9h+G-7p{E>2)sk5p>I40~m^|4#h&Lsz$yCL-eqSOAgswX^Z! zNc0VU{rW7UT3FqZa%5GKriZXLg6|8_a}x0cT*5LE);bu>%(5+V-a!)VU-wcz?8a3^ zpRR|}r|4C#l!)OEuFq>A0V_rdu;iq;<>0Gi8aj+K1lz<-HDaj@lX%`}Oy=Wv^Tq*EDG@@Jwq&Lx1->OCjP e&Icj<{F-ZxvHVpiTT2g_{!}xOBzd5A00029tOO7M diff --git a/app/src/main/res/drawable-nodpi/ic_tracker_bangumi.webp b/app/src/main/res/drawable-nodpi/ic_tracker_bangumi.webp deleted file mode 100644 index 26b1d4e963af192fd329a981d465197c26b0bc55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1354 zcmV-Q1-1H8Nk&FO1pok7MM6+kP&il$0000G0002v0083v06|PpNE-kE009p${}B;_ zOa$W_=%3c?>_qf`0w{J=|KIom09H^qAOHmb0FW#IodGK30OSBZkwTwIrKBSvE7%w) zuo4MlZrxt-{a$BI)6w#^I0ro4-LwJD=l^%0zdWx(yUm-_Sqr~`$2N)fuPfkpGHY2p zh~`rtOtQAAi+s(_cI`cSq(EhZ{KNtDjpE-Fx)0UPbnQ#rwr9Dp@Lq)m(*W~0!a;US znF#}cf=_!PBphz66O`yuoi%HSudL_BiS0SFL6aly4mIbcmIw5p9%hf#3b7mS0HGI4 zb_gHFeNBA3U*sr2=@3-Og^Rsb$qgrNeqPXh3D%XR3n!bi=r2|Im2X(1%_~=R(af+e z+8t9%BT!o|Dhp&TvbUrb-2;OKWfF3XY%{@9M)TWWK#9hP#p}syXBuXKu9YYUL+X!m z{ucqyPu4aPEw4@vAC%lE^R7Qps3jK2vSoD3->iIjpZ6^gdLx;iBE2Hp-LVmVivc^D z8)9n4D=+)0koGt@-CaFlsB!bBYG58`7*irhF@OO6?+5;-ckP)D<}efc`f1>}A)fW9 z3O5rd%mQox004vXgJXP#pwNnl+fBEDbXqn>L?VWM>3j5#@ZRl&t7xP=l;;Ef+`oX< zBy0c#4Mil{Me9!5Px|Xh2vev&$M9$zN(u_gmJHl2>nsgxK$I{-U;?P8DckFW9WZKQ z*e!73FBo?WiiW^mu@apx>&>G=ZM8;+z+QQp0>A=ybOuoi=fh-dF(l1=8n=_Xt{!O~ zofEP|eRvB{&5?D*d9fc&{d}viw_9a|?re709MSF^40ItXk1EstKN;x5n2Utp!vD>9 zS$}+^#*%P=J_;-pzqG{#VgPtSc)_b3yA0UUU*|z8^7uJ%J7bX#fK8fultg&dMRjB8EE_|~ukUGc&Ktyw!NG#SM1b&JX^KvCWim_Or@B;NyPPW;BU#a;HD z>fvE2#U#oq1y<> zfz~b9n^8}#D&miB)fGG0g<)ucYzOzZb0?<@{d72e+)|q*j{uBr(+A(Y{CXnlTm7D~ z^1}eMnv!b{UnC_q23tr|92n0@nnYQQZR&;AUVMVxrGa^{DdE6I{7)K-uo!g;LJaXR z&@pD~%UU`WB4o06NN~f&FWGdwcM?izSoc7h&HHhGj+$U7W7HR4iGV;JoX{h{ M37`M~00000021eUga7~l diff --git a/app/src/main/res/drawable-nodpi/ic_tracker_jellyfin.webp b/app/src/main/res/drawable-nodpi/ic_tracker_jellyfin.webp deleted file mode 100644 index 464207f57dc669d4c04d995b05f5465f86f241ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31950 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 I8;}410F5>AhyVZp diff --git a/app/src/main/res/drawable-nodpi/ic_tracker_mal.webp b/app/src/main/res/drawable-nodpi/ic_tracker_mal.webp deleted file mode 100644 index a9c6f2e929d02681b82bea00eacb2b96c3858858..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&goH1polBAOM{KD)0bg06vjGok^vmqaiC$>R7N6 z2~FFp&7b%5+REN*mv=qyXZYV%`(-@EdB1vH-k#o=$ZYWU_|DrazTaPJ-P(8&rDkS6 zKYpiJlIkso_nJbLDpu`VpMPz6pN{;IE+;RQhI1mR|Q(`~{C(RZ>%uD=6@ z7tGJrM>PT@MtjzM^Ceo`E}tCNuXRezgZIEl3O$gp?ksx3magU4z%e?|U>?V!ZVY}@ zkb7VJ&Rb-et6`1Z?%pyiwAL*l^HzA;NrMxzK*DC_B=2h_NQP(ZQdKXi&a~{n%f3SE;xy2N#C;zE{p$7$Jq`jV-H*#SCBl_gDrHb0@P|W1z4XY;0g!;@5S}o zhjeqJX>=dAoz0mbo86bY#;=OBNz&!R-xF2p{%_MNJC$(|fj>2?d!&N{U%8Qrbao|A zF~MNv*}?e%uN~D3cTg2Uf_G7-Tm<*8Q|I!I<2bVC3#Ue$7K@Nya^90Ue$Drx*CAP>YamTp|yg$fgFGR8SYof3S+ype3T11V%r| z?-oJm5g+(bK#-&DJN}jGtnj~K@^F)S@~UQ%5%F?M_$C%E#1|oF9$6DIbzAGBus22z zX*Om3_pE*@?eDXZx*Me5|Jlv7%Dv7SsYe+LG=V|F8$WIBv}m42xp~;Y%-SiICwaF) zt;}7ckdq!w9|KFyyu7-tUrFFO5WXTh04}iD@9Zvaew;FlNfAWrD!-xE|H{xDBUE%{ z-?GoFsc5`Q&0uS`xyz)^ikVn`@4s0pm6;;k12ac~27)iYpNr(v{<=zCkYR>$3I$L? zV$ke?Ijgf?8s#(GUO={dCG9h|rVgVNiOMrOrG89BX)&S}Z?}7WQxz3&Y+~XV=Ls%l zj@cE$ne6`m2KnGbv-_zfeG`5#`rC^Zn*UTwyRO{#Sfn;&F=+cEk({<_$*CNiw@9wD z#sOU9Cn4N^*VQifLMQNZjb$Oj)Bm)TzIF~{+(fz0VTwrP_mC}oLR*fNIg$wV^RBzk zFc@ey-8pCUTR`Xi8K?`cMVOUbqc#=f+zMi}-UnERa}z!+kT>r;RnIw`y3? z>pc$GForu|zP}`35ARyC{r%-`niWj9X&b|CYucfF#htw>xp~ z@9DPLa{S+rORMk|RWZBYb&6+hSO2cKg?qgNfuEwxd5t+1FYBnUO*K&Z`^7sQ4P$S4 zZt0DgDMVg)?LQ>&CQ0_VJfNY)G%563C0G_E23IB`>}vWw%^NWMRaeS0T{!W%bmvShF>%wC#ZZ!P$U zXh+1FsYXySbczLnW6M8qYxnC^-&=TYDEgEH<3)%Pa*7gk~s$K>;&tF_H9ZG@0hmy*LQkw~wnLMHA`pa9wc K1y}$80001V0ljko diff --git a/app/src/main/res/drawable-nodpi/ic_tracker_shikimori.webp b/app/src/main/res/drawable-nodpi/ic_tracker_shikimori.webp deleted file mode 100644 index f08ce3839f5bfb79cc6c5e2463a2945b09068a20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2948 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 + + + + diff --git a/app/src/main/res/drawable/brand_bangumi.xml b/app/src/main/res/drawable/brand_bangumi.xml new file mode 100644 index 0000000000..0636040af7 --- /dev/null +++ b/app/src/main/res/drawable/brand_bangumi.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/brand_jellyfin.xml b/app/src/main/res/drawable/brand_jellyfin.xml new file mode 100644 index 0000000000..adb864b287 --- /dev/null +++ b/app/src/main/res/drawable/brand_jellyfin.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/brand_kitsu.xml b/app/src/main/res/drawable/brand_kitsu.xml new file mode 100644 index 0000000000..ed094a44d4 --- /dev/null +++ b/app/src/main/res/drawable/brand_kitsu.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/app/src/main/res/drawable/brand_myanimelist.xml b/app/src/main/res/drawable/brand_myanimelist.xml new file mode 100644 index 0000000000..f0f1848bb5 --- /dev/null +++ b/app/src/main/res/drawable/brand_myanimelist.xml @@ -0,0 +1,16 @@ + + + + diff --git a/app/src/main/res/drawable/brand_shikimori.xml b/app/src/main/res/drawable/brand_shikimori.xml new file mode 100644 index 0000000000..84a5702a8b --- /dev/null +++ b/app/src/main/res/drawable/brand_shikimori.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/app/src/main/res/drawable/brand_simkl.xml b/app/src/main/res/drawable/brand_simkl.xml new file mode 100644 index 0000000000..76b100e829 --- /dev/null +++ b/app/src/main/res/drawable/brand_simkl.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + From ffdfafc337f89b29c390b58f70d6cfa4711855bd Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 11 Dec 2025 14:56:36 +0000 Subject: [PATCH 71/82] Update dependency com.android.tools.build:gradle to v8.13.2 (#2780) (cherry picked from commit 4cb05cc738862be52c5f53e43c943f20712c6153) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 3cee2939e0..c77ce2f3d8 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -1,5 +1,5 @@ [versions] -agp_version = "8.13.1" +agp_version = "8.13.2" lifecycle_version = "2.10.0" paging_version = "3.3.6" interpolator_version = "1.0.0" From 42e855b48b45796b9f706cd224d5b3db2af2bae2 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sat, 13 Dec 2025 00:18:48 +0600 Subject: [PATCH 72/82] Use AGP provided NDK and Build Tools version (cherry picked from commit 5fe7dd9f0612412afabd7646f89ba38b230fb7e7) --- buildSrc/src/main/kotlin/mihon/buildlogic/AndroidConfig.kt | 2 -- .../src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt | 4 ---- 2 files changed, 6 deletions(-) diff --git a/buildSrc/src/main/kotlin/mihon/buildlogic/AndroidConfig.kt b/buildSrc/src/main/kotlin/mihon/buildlogic/AndroidConfig.kt index 044300c457..f97970c4c8 100644 --- a/buildSrc/src/main/kotlin/mihon/buildlogic/AndroidConfig.kt +++ b/buildSrc/src/main/kotlin/mihon/buildlogic/AndroidConfig.kt @@ -7,8 +7,6 @@ object AndroidConfig { const val COMPILE_SDK = 36 const val TARGET_SDK = 36 const val MIN_SDK = 26 - const val NDK = "27.1.12297006" - const val BUILD_TOOLS = "35.0.1" // https://youtrack.jetbrains.com/issue/KT-66995/JvmTarget-and-JavaVersion-compatibility-for-easier-JVM-version-setup val JavaVersion = GradleJavaVersion.VERSION_17 diff --git a/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt b/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt index 66140d1156..916ec38f42 100644 --- a/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt +++ b/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt @@ -26,13 +26,9 @@ val Project.libs get() = the() internal fun Project.configureAndroid(commonExtension: CommonExtension<*, *, *, *, *, *>) { commonExtension.apply { compileSdk = AndroidConfig.COMPILE_SDK - buildToolsVersion = AndroidConfig.BUILD_TOOLS defaultConfig { minSdk = AndroidConfig.MIN_SDK - ndk { - version = AndroidConfig.NDK - } } compileOptions { From c1d45267c4e8650355b49576bb602a63f0f24c10 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Fri, 12 Dec 2025 18:22:54 +0000 Subject: [PATCH 73/82] Update dependency com.google.firebase:firebase-bom to v34.7.0 (#2782) (cherry picked from commit e7e4d9b6b35033a0568f40e32e94aaf336c96c39) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3fd901c248..efc5c3c6e3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ sqlite = "2.6.2" voyager = "1.1.0-beta03" spotless = "8.1.0" ktlint-core = "1.8.0" -firebase-bom = "34.6.0" +firebase-bom = "34.7.0" markdown = "0.38.1" junit = "6.0.1" From 07ea105b399106e24c44c26898cf7693dc61c5b4 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 13 Dec 2025 09:59:27 +0100 Subject: [PATCH 74/82] Update GitHub Actions (#2786) (cherry picked from commit 2ecb70a590b89fb2c75e6b7992d463366389e633) --- .github/workflows/build.yml | 6 +++--- .github/workflows/release.yml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 44fa083cd7..0d7f497c5c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -61,19 +61,19 @@ jobs: - name: Upload test report if: steps.unit_tests.outcome == 'failure' - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: test-report-${{ github.sha }} path: app/build/reports/tests/testReleaseUnitTest - name: Upload APK - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: arm64-v8a-${{ github.sha }} path: app/build/outputs/apk/release/app-arm64-v8a-release-unsigned.apk - name: Upload mapping - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: mapping-${{ github.sha }} path: app/build/outputs/mapping/release diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3aee3423de..2a3d256b1c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -80,7 +80,7 @@ jobs: mv app/build/outputs/apk/release/app-x86_64-release-unsigned-signed.apk Animiru-x86_64-${{ needs.get_tag.outputs.tag }}.apk - name: Upload APK - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: Animiru path: | @@ -98,7 +98,7 @@ jobs: steps: - name: Download all artifacts - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 + uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 with: merge-multiple: true From f01e45e87ed3ffef63c7654eed4f4a563b03524f Mon Sep 17 00:00:00 2001 From: Luca Auer Date: Tue, 16 Dec 2025 18:08:24 +0100 Subject: [PATCH 75/82] Minimize memory usage by reducing in-memory cover cache size (#2266) Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> (cherry picked from commit 4c9cfd8da5f9c67daa4b6401a910f979fd79179f) --- app/src/main/java/eu/kanade/tachiyomi/App.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 0fae0e0c6e..f0c9564e99 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -17,6 +17,7 @@ import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.lifecycleScope import coil3.ImageLoader import coil3.SingletonImageLoader +import coil3.memory.MemoryCache import coil3.network.okhttp.OkHttpNetworkFetcherFactory import coil3.request.allowRgb565 import coil3.request.crossfade @@ -180,6 +181,12 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor add(AnimeKeyer()) } + memoryCache( + MemoryCache.Builder() + .maxSizePercent(context) + .build(), + ) + crossfade((300 * this@App.animatorDurationScale).toInt()) allowRgb565(DeviceUtil.isLowRamDevice(this@App)) if (networkPreferences.verboseLogging().get()) logger(DebugLogger()) From 8c0f44e15aa7433eaddc2073fc448fa571ce2902 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 16 Dec 2025 17:10:37 +0000 Subject: [PATCH 76/82] Update kotlin monorepo to v2.3.0 (#2794) (cherry picked from commit 3cb1b2e17a5f77d6133e6bf244304c2d6719aa04) --- gradle/kotlinx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/kotlinx.versions.toml b/gradle/kotlinx.versions.toml index 91e640b175..81142d4547 100644 --- a/gradle/kotlinx.versions.toml +++ b/gradle/kotlinx.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin_version = "2.2.21" +kotlin_version = "2.3.0" serialization_version = "1.9.0" xml_serialization_version = "0.91.3" From 7d3c47f26983853eb97953da52e9677cd65d93f6 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 18 Dec 2025 10:44:50 +0000 Subject: [PATCH 77/82] Update dependency androidx.activity:activity-compose to v1.12.2 (#2797) (cherry picked from commit 532b5cf290b448814ce5370bde461d9d5c8f086a) --- gradle/compose.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index 4bf14354e6..b97528d2b6 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -2,7 +2,7 @@ compose-bom = "2025.09.00" [libraries] -activity = "androidx.activity:activity-compose:1.12.1" +activity = "androidx.activity:activity-compose:1.12.2" bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } foundation = { module = "androidx.compose.foundation:foundation" } animation = { module = "androidx.compose.animation:animation" } From c44414b49e18f0843e3226c164e21a1b31035d01 Mon Sep 17 00:00:00 2001 From: MajorTanya <39014446+majortanya@users.noreply.github.com> Date: Thu, 18 Dec 2025 12:26:35 +0100 Subject: [PATCH 78/82] Fix pre-1970 upload date display in chapter list (#2779) A user in #2777 was using the ComicInfo.xml Year/Month/Day fields to indicate date of publication for some American comics, which often predate the UNIX Epoch of 1970. They were seeing "N/A" displays because this line of code discarded date information for any time before Jan 1st, 1970. The `toRelativeString` extension function used in the other `relativeDateText` function already accounts for very distant dates (anything >7 days away turns into full date, not relative, regardless of setting, though disabling the relative timestamp setting circumvents this with the same result). Removing this line should not cause any issues as it is purely a display difference and the use case of backdating comics to pre-1970 is worth it in my opinion. (cherry picked from commit 7a1c8a1b61e07d2e1a402b5daf0e7c04c232f655) --- app/src/main/java/eu/kanade/presentation/components/DateText.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/eu/kanade/presentation/components/DateText.kt b/app/src/main/java/eu/kanade/presentation/components/DateText.kt index 1c72dfb898..f92c006a03 100644 --- a/app/src/main/java/eu/kanade/presentation/components/DateText.kt +++ b/app/src/main/java/eu/kanade/presentation/components/DateText.kt @@ -23,7 +23,7 @@ fun relativeDateText( Instant.ofEpochMilli(dateEpochMillis), ZoneId.systemDefault(), ) - .takeIf { dateEpochMillis > 0L }, + .takeIf { dateEpochMillis != 0L }, ) } From 34350899f3f0ae3d3d68cb18736c066c5af8f952 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 20 Dec 2025 12:33:30 +0000 Subject: [PATCH 79/82] Update aboutlib.version to v13.2.1 (#2803) (cherry picked from commit f37afbcec9f21823cd894036b6ca7f464eb34481) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index efc5c3c6e3..ba7a664925 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -aboutlib_version = "13.1.0" +aboutlib_version = "13.2.1" leakcanary = "2.14" moko = "0.25.2" okhttp_version = "5.3.2" From 7ef0758c87351a4d941586886bf9213a613112a7 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 20 Dec 2025 12:33:50 +0000 Subject: [PATCH 80/82] Update markdown to v0.39.0 (#2804) (cherry picked from commit e3260d56f713d4f5411ae00dfd3da2aba87f4cf2) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ba7a664925..26f4ca4c1b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ voyager = "1.1.0-beta03" spotless = "8.1.0" ktlint-core = "1.8.0" firebase-bom = "34.7.0" -markdown = "0.38.1" +markdown = "0.39.0" junit = "6.0.1" [libraries] From 182fa7bba83a781938428cee104200dc3a7d1956 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Sat, 20 Dec 2025 12:34:06 +0000 Subject: [PATCH 81/82] Update dependency androidx.compose:compose-bom to v2025.12.01 (#2651) (cherry picked from commit 23c427cf60701e46e470fee8b0a7564804ec599e) --- gradle/compose.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index b97528d2b6..ccd2659d00 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -1,5 +1,5 @@ [versions] -compose-bom = "2025.09.00" +compose-bom = "2025.12.01" [libraries] activity = "androidx.activity:activity-compose:1.12.2" From d0454ad7b6665ff57e9c476dc351526fbbdf70b6 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sat, 20 Dec 2025 13:51:10 +0100 Subject: [PATCH 82/82] Translations update from Hosted Weblate (#2711) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/ar/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/ka/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ar/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/bn/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/eo/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ka/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ko/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/tr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/vi/ Translation: Mihon/Mihon Translation: Mihon/Mihon Plurals Co-authored-by: Anderhale Co-authored-by: Frosted Co-authored-by: Hasanur Rahman Biplob Co-authored-by: Jakub Szafranek13 Fabijan Co-authored-by: Nguyễn Trung Đức Co-authored-by: Temuri Doghonadze Co-authored-by: ابْنُ السَدِيمِ Co-authored-by: 안세훈 (cherry picked from commit c96b6ae562cee1220b9fec74708d447413ab8c35) --- .../commonMain/moko-resources/ar/plurals.xml | 18 +- .../commonMain/moko-resources/ar/strings.xml | 6 + .../commonMain/moko-resources/bn/strings.xml | 177 +++++++++++++++--- .../commonMain/moko-resources/eo/strings.xml | 4 + .../moko-resources/ka-rGE/plurals.xml | 40 ++++ .../moko-resources/ka-rGE/strings.xml | 10 +- .../commonMain/moko-resources/ko/strings.xml | 4 + .../commonMain/moko-resources/tr/strings.xml | 2 +- .../commonMain/moko-resources/vi/strings.xml | 7 +- 9 files changed, 228 insertions(+), 40 deletions(-) diff --git a/i18n/src/commonMain/moko-resources/ar/plurals.xml b/i18n/src/commonMain/moko-resources/ar/plurals.xml index b50f7af97d..d8ed2da3e2 100644 --- a/i18n/src/commonMain/moko-resources/ar/plurals.xml +++ b/i18n/src/commonMain/moko-resources/ar/plurals.xml @@ -153,18 +153,18 @@ بعد %1$d أيام - نقل %1$d مدخل - نقل %1$d مدخل - نقل %1$d مدخل - نقل %1$d مدخل - نقل %1$d مدخل - نقل %1$d مدخل + نقل %1$d مدخل؟ + نقل مدخل؟ + نقل مدخلان؟ + نقل %1$d مداخل؟ + نقل %1$d مدخل؟ + نقل %1$d مدخل؟ نسخ %1$d مدخل؟ - نسخ %1$d مدخل؟ - نسخ %1$d مدخل؟ - نسخ %1$d مدخل؟ + نسخ مدخل؟ + نسخ مدخلان؟ + نسخ %1$d مداخل؟ نسخ %1$d مدخل؟ نسخ %1$d مدخل؟ diff --git a/i18n/src/commonMain/moko-resources/ar/strings.xml b/i18n/src/commonMain/moko-resources/ar/strings.xml index fe0fca5e27..92daeeed5a 100644 --- a/i18n/src/commonMain/moko-resources/ar/strings.xml +++ b/i18n/src/commonMain/moko-resources/ar/strings.xml @@ -903,4 +903,10 @@ إلغاء إلغاء لم يتم العثور على فصول، لا يمكن استخدام هذا الإدخال للنقل + أغلق التبويب + منع استخدام أسماء ملفات بغير الحروف اللاتينية + يضمن التوافق مع بعض وسائط التخزين التي لا تدعم الترميز الموحد. عند تفعيل هذا الخيار، ستحتاج إلى إعادة تسمية مجلدات المصدر والمانغا يدويًا عبر استبدال الأحرف غير التابعة لـ ASCII (المحارف اللاتينية) بتمثيلها السداسي العشري (hex) بنظام UTF-8 وبحروف صغيرة. ملفات الفصول لا تحتاج إلى إعادة تسمية. + تنزيل مصادر متعددة في وقت واحد + تنزيل صفحات متعددة في وقت واحد + عدد الصفحات التي يتم تنزيلها في وقت واحد لكل مصدر diff --git a/i18n/src/commonMain/moko-resources/bn/strings.xml b/i18n/src/commonMain/moko-resources/bn/strings.xml index 8c78103065..8053555aaf 100644 --- a/i18n/src/commonMain/moko-resources/bn/strings.xml +++ b/i18n/src/commonMain/moko-resources/bn/strings.xml @@ -119,9 +119,9 @@ লক করা পোর্ট্রেট লক করা ল্যান্ডস্কেপ - - নী - + সবুজ + নীল + আলফা পঠিত হিসেবে চিহ্নিত করার পর পড়ার পর স্বয়ংক্রিয়ভাবে নিষ্ক্রিয় @@ -196,7 +196,7 @@ বিভাগগুলি মোছা হয়েছে এটা এই অধ্যায়ের পড়ার সময়কাল সরিয়ে ফেলবে। আপনি নিশ্চিত? এই মাংগার জন্য সব অধ্যায় পুনঃবিন্যাস করুন - সংগ্রহশালায় মাঙ্গা যোগ করবেন? + লাইব্রেরিতে যোগ করবেন? ছবি সংরক্ষিত হয়েছে স্বনির্ধারিত ফিল্টার প্রচ্ছদ হিসাবে সংরক্ষণ করুন @@ -242,11 +242,7 @@ অনির্ভরযোগ্য আন ইন্সটল অনির্ভর‍যোগ্য এক্সটেনশন - এই এক্সটেনশনটি একটি অবিশ্বস্ত সার্টিফিকেট দিয়ে স্বাক্ষরিত হয়েছিল এবং সক্রিয় করা হয়নি। -\n -\nএকটি দূষিত এক্সটেনশন টাচিওমিতে সংরক্ষিত যেকোন লগইন শংসাপত্র পড়তে পারে বা নির্বিচারে কোড চালাতে পারে। -\n -\nএই শংসাপত্রটি বিশ্বাস করে আপনি এই ঝুঁকিগুলি গ্রহণ করেন। + ক্ষতিকর এক্সটেনশন সংরক্ষিত লগইন তথ্য পড়তে পারে বা ইচ্ছেমতো কোড চালাতে পারে।\n\nএই এক্সটেনশনটিকে বিশ্বাস করলে আপনি এসব ঝুঁকি মেনে নিচ্ছেন। দুই টোকার এনিমেশনের গতি এনিমেশন নেই সাধারণ @@ -290,8 +286,8 @@ অচল এই এক্সটেনশন আর উপলব্ধ নয়। ইমেল ঠিকানা - লাইব্রেরিতে - লাইব্রেরিতে যুক্ত করুন + লাইব্রেরিতে আছে + লাইব্রেরিতে রাখো আরও কম উল্টো নির্বাচন করুন @@ -308,10 +304,10 @@ সবসময় আনলক প্রয়োজন নিরাপত্তা ও গোপনীয়তা - বিজ্ঞপ্তিগুলি নিয়ন্ত্রণ করুন + বিজ্ঞপ্তি ব্যবস্থাপনা তারিখের রীতি - চালু করুন - বন্ধ করুন + ডার্ক + লাইট সিস্টেমকে অনুসরণ করুন থিম নীচে সরান @@ -333,7 +329,7 @@ ব্যাপক আপডেট অ্যাপ পাল্টানোর সময় অ্যাপের কন্টেন্ট লুকান ও স্ক্রিনসট ব্লক করুন সেটিংসে খুঁজুন - কর্মহীন হলে লক করুন + কর্মহীন হলে লক হবে হালনাগাদকৃত প্রকৃত শ্রেণির সেটিংস প্রকৃত হিসেবে সংরক্ষণ করুন আপনি কি নিশ্চিত সেটিংসগুলো প্রকৃত হিসেবে সংরক্ষণ করবেন? @@ -466,9 +462,7 @@ ডাম্প ক্র্যাশ লগ এইচটিটিপিএস এর উপর ডিএনএস এমআইইউআই অপ্টিমাইজেশন নিষ্ক্রিয় থাকলে ব্যাকআপ/রিস্টোর সঠিকভাবে কাজ নাও করতে পারে। - ব্যাকআপ ফাইল থেকে ডেটা পুনরুদ্ধার করা হবে। -\n -\nআপনাকে যে কোন অনুপস্থিত এক্সটেনশন ইনস্টল করতে হবে এবং সেগুলি ব্যবহার করার জন্য পরে ট্র্যাকিং পরিষেবাগুলিতে লগ ইন করতে হবে। + সম্ভবত অনুপস্থিত এক্সটেনশন ইনস্টল করতে হবে এবং ট্র্যাকিং সার্ভিসগুলোতে পরে লগইন করতে হবে এগুলো ব্যবহার করতে। ট্র্যাক নির্দিষ্ট উৎসের জন্য উন্নত বৈশিষ্ট্য প্রদান করে এমন পরিষেবা। আপনার লাইব্রেরিতে যোগ করা হলে মাঙ্গা স্বয়ংক্রিয়ভাবে ট্র্যাক করা হয়। উন্নত সেবা @@ -507,11 +501,11 @@ সাজানোর এবং প্রদর্শনের জন্য প্রতি শ্রেণীর সেটিংস বিধিনিষেধ: %s সম্প্রতি - বিশুদ্ধ কালো অন্ধকার মোড - চার পাতা + খাঁটি কালো ডার্ক মোড + ইয়োৎসুবা ইয়িন এবং ইয়াং টিল এবং ফিরোজা - তাই + টাকো স্ট্রবেরি ডাইকুইরি মধ্যরাতের সন্ধ্যা সবুজ আপেল @@ -601,7 +595,7 @@ পড়া চালিয়ে যান বোতাম ডাউনলোড চেক করা হচ্ছে পৃষ্ঠার ফাইল পাথ খুঁজে পাওয়া যায়নি %d - অবৈধ ডাউনলোড সমুহ + ডাউনলোড পুনঃসূচিপত্র এখন না ডিবাগ তথ্য বাদ দেওয়া হয়েছে কারণ সিরিজের আপডেটের প্রয়োজন নেই @@ -693,4 +687,143 @@ সাদা আর কালো যদি রিডার একটি ফাঁকা ছবি লোড করে, ধাপে ধাপে থ্রেশহোল্ড কমিয়ে দিন।\nসিলেক্টেড %s পারফরম্যান্স অ্যাফেক্ট করবে। ফাঁকা ইমেজ সমস্যা থ্রেশহোল্ড কমিয়ে ঠিক না হলে কেবল এনেবল করবে + ডোনেট + অটোমেটিক ডাউনলোড, আগাম ডাউনলোড + ওয়ান-ওয়ে প্রগ্রেস সিঙ্ক, এনহ্যান্সড সিঙ্ক + সোর্স, এক্সটেনশন, গ্লোবাল সার্চ + ক্র্যাশ লগ ডাম্প, ব্যাটারি অপ্টিমাইজেশন + ক্যাটপুচিন + মনোক্রোম + নর্ড + নন‑ASCII ফাইলনেম নিষিদ্ধ + কিছু স্টোরেজ মিডিয়া ইউনিকোড সমর্থন করে না। এই অপশন চালু করলে সোর্স এবং মাঙ্গা ফোল্ডারগুলো আপনাকে ম্যানুয়ালি নতুন নাম দিতে হবে। নন‑ASCII অক্ষরগুলোর পরিবর্তে ছোট হাতের UTF‑8 হেক্সাডেসিমাল কোড ব্যবহার করতে হবে। অধ্যায় ফাইলগুলো আলাদা করে নাম বদলানোর দরকার নেই। + সরান + এক্সটেনশন সরাতে চান? + আপনি কি নিশ্চিত \"%s\" এক্সটেনশন সরাতে চান? + ভার্সন + ভাষা + বয়স সীমা + এক্সটেনশন ইনস্টল করতে অনুমতি লাগবে। অনুমতি দিতে এখানে ট্যাপ করুন। + অজানা এক্সটেনশনের ট্রাস্ট বাতিল + এক্সটেনশন রিপো + আপনার কোনো রিপো সেট করা নেই। + রিপো অ্যাড করুন + রিপো URL + %s‑এ আরও রিপো যোগ করুন। এটি এমন একটি URL হতে হবে যা \"index.min.json\" দিয়ে শেষ হয়। + এই রিপো ইতিমধ্যে আছে! + রিপো ডিলিট + ভুল রিপো URL + আপনি কি “%s” রিপোটি ডিলিট করতে চান? + আপনি কি “%s” রিপোটি যোগ করতে চান? + রিপোর সোর্সে যান + রিপ্লেস + সাইনিং কী ফিঙ্গারপ্রিন্ট ইতিমধ্যেই আছে + রিপোজিটরি %1$s এর সাইনিং কী ফিঙ্গারপ্রিন্ট %2$s এর সাথে একই।\nযদি এটি প্রত্যাশিত হয়, তবে %2$s রিপ্লেস হবে, অন্যথায় আপনার রিপো মেইনটেইনারের সাথে যোগাযোগ করুন। + চওড়া পেজ রোটেট করে ফিট হবে + রোটেট করা চওড়া পেজের অরিয়েন্টেশন উল্টানো হবে + জুম করতে ডাবল ট্যাপ + পেজ পরিবর্তনে ফ্ল্যাশ + ই‑ইঙ্ক ডিসপ্লেতে ঘোস্টিং কমায় + ফ্ল্যাশ সময়কাল + %1$s মি.সেকেন্ড + ফ্ল্যাশ সহ + %d সেকেন্ড + %d মি. + %d ঘণ্টা + %d দিন + N/A + ব্যবহৃত + গড় স্কোর + ট্র্যাক করা এন্ট্রি + ট্র্যাকারসমূহ + পড়া + মোট + গ্লোবাল আপডেটে + এন্ট্রি সমূহ + পড়ার সময়কাল + সম্পন্ন এন্ট্রি + সারসংক্ষেপ + অ্যাপ রিস্টার্ট করুন + %s অপ্রত্যাশিত ত্রুটিতে পড়েছে। ক্র্যাশ লগগুলো আমাদের Discordএর support চ্যানেলে শেয়ার করুন। + উফ! + ইনস্টল করা হয়নি + আরে, এখানে তো কিছুই নেই + কাস্টম হার্ডওয়্যার বিটম্যাপ থ্রাশহোল্ড + ডিফল্ট (%d) + লিগ্যাসি ডিকোডার ব্যবহার করুন লং স্ট্রিপ রিডারের জন্য + কাস্টম ডিসপ্লে প্রোফাইল + ডুপ্লিকেট চ্যাপ্টার বাদ + নিষ্ক্রিয় + চওড়া ছবি প্যান হবে + অটোমেটিক জুম হবে চওড়া ছবিতে + পোর্ট্রেট উল্টানো হবে + জুম আউট বন্ধ + স্টোরেজ লোকেশন সেট নেই + ভুল লোকেশন: %s + ডাউনলোড ফোল্ডার তৈরি ব্যর্থ হয়েছে + ফোল্ডার তৈরি ব্যর্থ হয়েছে: %s + ডুপ্লিকেট পড়া অধ্যায় ডাউনলোড বাদ হবে + অধ্যায় আগাম ডাউনলোড + শুধু তখনই কাজ করবে যদি বর্তমান আর পরের অধ্যায় আগে থেকেই ডাউনলোড করা থাকে। + CBZ আর্কাইভ হিসেবে সেভ হবে + লম্বা ছবি ভাগ হবে + একসাথে কত সোর্স থেকে ডাউনলোড + একসাথে পাতা ডাউনলোড + প্রতি সোর্স থেকে একসাথে ক’টি পাতা ডাউনলোড হবে + পড়া হিসেবে চিহ্নিত হলে অগ্রগতি আপডেট হবে + উপলব্ধ কিন্তু সোর্স ইনস্টল করা নেই: %s + ট্র্যাকার লগইন + লাইব্রেরিতে থাকা আইটেম লুকানো হবে + স্টোরেজের ঠিকানা + অটোমেটিক ব্যাকআপ এর জন্য, চ্যাপ্টার ডাউনলোড ও লোকাল সোর্স এর জন্য ব্যবহার হয়। + তৈরি + ফুল ইরর: + JSON ব্যাকআপ সমর্থিত নয় + ব্যাকআপ ফাইলটি নষ্ট হয়েছে + অ্যাপ সেটিংস + সোর্স সেটিংস + এক্সটেনশন রিপো + সংবেদনশীল সেটিংস অন্তর্ভুক্ত করুন (যেমন, ট্র্যাকার লগইন টোকেন) + সব পড়া এন্ট্রি + স্টোরেজ অনুমতি দেওয়া হয়নি + ব্যাকআপ করার মতো কোন এন্ট্রি নেই + ব্যাকআপ ফাইল তৈরি করা যায়নি + শেষবার স্বয়ংক্রিয়ভাবে ব্যাকআপ নেওয়া হয়েছে: %s + স্টোরেজ ব্যবহার + খালি: %1$s/ মোট: %2$s + এক্সপোর্ট + লাইব্রেরী লিস্ট + লাইব্রেরী এক্সপোর্ট করা হয়েছে + লাইব্রেরী সিন্ক করা হচ্ছে + লাইব্রেরি সিঙ্ক সম্পন্ন হয়েছে + ডিফল্ট ইউজার এজেন্ট স্ট্রিং + ইউজার এজেন্ট স্ট্রিং খালি রাখা যাবে না + অবৈধ ইউজার এজেন্ট স্ট্রিং + অধ্যায় পড়ার তথ্য ও লাইব্রেরির বাইরে থাকা এন্ট্রিগুলোর অগ্রগতি মুছে যাবে + পড়া অধ্যায়গুলোর এন্ট্রিগুলি রাখুন + প্রতি সিরিজের রিডার সেটিংস রিসেট + সব সিরিজের রিডিং মোড এবং অভিমুখ রিসেট + রিডার সেটিংস রিসেট করা যায়নি + লাইব্রেরির মাঙ্গার শিরোনাম সোর্সের সাথে মিলিয়ে আপডেট + সতর্কতা: নাম পরিবর্তিত মাঙ্গা ডাউনলোড কিউ থেকে সরানো হবে (যদি থাকে)। + F‑Droid বিল্ডগুলো আনুষ্ঠানিকভাবে সমর্থিত নয়।\n বিস্তারিত জানতে ট্যাপ করুন। + এক্সটেনশনের জন্য রিডিং হিস্ট্রি বিরতি + লগইন হচ্ছে… + কোনও বর্ণনা নেই + লেখক + শিল্পী + জনপ্রিয় + ফলাফল আছে + অনুমান প্রতি + শীঘ্রই + নিজস্ব আপডেট ঘনত্ব: + নিজস্ব কভার + স্ক্যানলেটর বাদ + কোনো স্ক্যানলেটর পাওয়া যায়নি + ব্যক্তিগত ট্র্যাকিং + %1$s ত্রুটি: %2$s + তারিখ মুছবেন? + এটি %s থেকে পূর্বে নির্বাচিত শুরুর তারিখ মুছে ফেলবে + এটি %s থেকে পূর্বে নির্বাচিত শেষ তারিখ মুছে ফেলবে + %s ট্র্যাকিং মুছে ফেলা হবে? diff --git a/i18n/src/commonMain/moko-resources/eo/strings.xml b/i18n/src/commonMain/moko-resources/eo/strings.xml index e94087a9fb..8f2cb9ae2c 100644 --- a/i18n/src/commonMain/moko-resources/eo/strings.xml +++ b/i18n/src/commonMain/moko-resources/eo/strings.xml @@ -896,4 +896,8 @@ Sekvata private Malpermesi ne-ASCII-dosiernomojn Certigas kongruon kun certaj konservejaj dosiersistemoj kiuj ne subtenas Unikodon. Kiam tio estas ŝaltita, vi bezonos permane renomi dosierujojn de fontoj kaj mangaoj anstataŭigante ne-ASCII-signojn per iliaj minusklaj UTF-8-deksesumaj prezentoj. Ĉapitraj dosieroj ne necesas esti renomitaj. + Fermi langeton + Kunrulaj elŝutoj de fontoj + Kunrulaj elŝutoj de paĝoj + Paĝoj elŝutitaj sammomente por fonto diff --git a/i18n/src/commonMain/moko-resources/ka-rGE/plurals.xml b/i18n/src/commonMain/moko-resources/ka-rGE/plurals.xml index 1f31d89244..64389daa82 100644 --- a/i18n/src/commonMain/moko-resources/ka-rGE/plurals.xml +++ b/i18n/src/commonMain/moko-resources/ka-rGE/plurals.xml @@ -36,4 +36,44 @@ 1 წუთის შემდეგ %1$s წუთის შემდეგ + + გუშინ + %1$d დღის წინ + + + ხვალ + %1$d დღეში + + + შემდეგი წაუკითხავი თავი + შემდეგი %d წაუკითხავი თავი + + + 1 დღე + %d დღე + + + 1 გვერდი + %1$s გვერდი + + + აკლია %1$s თავი + აკლია %1$s თავი + + + შემდეგი თავი + შემდეგი %d თავი + + + %d ტრეკერი + %d ტრეკერი + + + გამოტოვებულია %d ტავი. ან წყარო აღმოჩენილი არაა, ან ფილტრში მოჰყვა + გამოტოვებულია %d ტავი. ან წყარო აღმოჩენილი არაა, ან ფილტრში მოჰყვა + + + %d რეპო + %d რეპო + diff --git a/i18n/src/commonMain/moko-resources/ka-rGE/strings.xml b/i18n/src/commonMain/moko-resources/ka-rGE/strings.xml index 8c29cf68f1..a0a451f620 100644 --- a/i18n/src/commonMain/moko-resources/ka-rGE/strings.xml +++ b/i18n/src/commonMain/moko-resources/ka-rGE/strings.xml @@ -92,7 +92,7 @@ უსაფრთხოების ფანჯარა შეტყობინების შიგთავსის დამალვა დისპლეი - ნივთები რიგში + ელემენტი თითოეულ მწკრივში პორტრეტი პეიზაჟი განახლებები @@ -163,10 +163,10 @@ თავისუფალი პორტრეტის რეჟიმი პეიზაჟის რეჟიმი - R - G - B - A + წითელი + მწვანე + ლურჯი + ალფა ყოველთვის აჩვენე თავებს შორის გადასვლა კითხვა ცარიელი არეა გვერდებზე diff --git a/i18n/src/commonMain/moko-resources/ko/strings.xml b/i18n/src/commonMain/moko-resources/ko/strings.xml index f57530425c..25f2fed426 100644 --- a/i18n/src/commonMain/moko-resources/ko/strings.xml +++ b/i18n/src/commonMain/moko-resources/ko/strings.xml @@ -868,4 +868,8 @@ 선택 해제 ASCII가 아닌 파일명 비허용 유니코드를 지원하지 않는 특정 저장 매체와의 호환성을 보장합니다. 이 기능을 활성화하면 원본 폴더와 만화 폴더의 이름을 수동으로 변경해야 합니다. ASCII가 아닌 문자를 해당하는 소문자 UTF-8 16진수 표현으로 대체하여 이름을 변경하십시오. 챕터 파일은 이름을 변경할 필요가 없습니다. + 탭 닫기 + 동시 소스 다운로드 + 동시 페이지 다운로드 + 소스별 동시에 다운로드된 페이지 수 diff --git a/i18n/src/commonMain/moko-resources/tr/strings.xml b/i18n/src/commonMain/moko-resources/tr/strings.xml index 1ea442f797..eb9ed5035b 100644 --- a/i18n/src/commonMain/moko-resources/tr/strings.xml +++ b/i18n/src/commonMain/moko-resources/tr/strings.xml @@ -850,7 +850,7 @@ Yeni bir bölüm geldiğinde Notları düzenle Notlar - …olduğu kısmı beğendim + …olduğu kısmı beğendim. Muhtemel yinelenenler Kitaplığınızda benzer isimli girdiler var.\n\nTaşımak için bir girdi seçin veya yine de ekleyin. Kitaplıkta olmayan girdilerin okunmuş bölümleri ve ilerlemeleri kaybolacaktır diff --git a/i18n/src/commonMain/moko-resources/vi/strings.xml b/i18n/src/commonMain/moko-resources/vi/strings.xml index ec645d70ee..1e697ae2ba 100644 --- a/i18n/src/commonMain/moko-resources/vi/strings.xml +++ b/i18n/src/commonMain/moko-resources/vi/strings.xml @@ -68,7 +68,7 @@ Tất cả Những hạn chế cập nhật thiết bị tự động Khi đang sạc - Đã có trạng thái \"Hoàn Thành\" + Có trạng thái \"Đã hoàn thành\" Cập nhật tiến triển sau khi đọc Toàn màn hình Hoạt ảnh chuyển trang @@ -534,7 +534,7 @@ Trình cài đặt Shizuku đang không chạy Phần kế thừa - Đăng nhập tường tận + Ghi nhật ký chi tiết Ngôn ngữ Bạn nên giữ lại bản sao của sao lưu ở các nơi khác nữa. In các ghi chép tường tận đến cả ghi chép hệ thống ( giảm hiệu suất ứng dụng ) @@ -770,7 +770,7 @@ Bao gồm những cài đặt nhạy cảm (ví dụ như token đăng nhập tracker) Luôn luôn thêm Phương bắc - Cập nhật thông minh + Tùy chọn bỏ qua cập nhật Sắp tới Cập nhật từ phiên bản cũ hơn và không biết nên chọn gì? Tham khảo hướng dẫn để biết thêm thông tin. Thêm nguồn bổ sung vào %s. Địa chỉ URL này cần phải kết thúc với \"index.min.json\". @@ -908,4 +908,5 @@ Tải xuống nguồn đồng thời Tải xuống trang đồng thời Các trang được tải xuống đồng thời theo từng nguồn + Đóng thẻ